C# 使用外部库中声明的结构反序列化对象

C# 使用外部库中声明的结构反序列化对象,c#,serialization,json.net,C#,Serialization,Json.net,我有一个要反序列化的对象,该对象在外部库中声明为struct(标记为可序列化)。但是,Json.net无法反序列化该对象。序列化很好,但反序列化不起作用。我已经尝试将struct更改为class,但没有效果。我是否需要在JsonSerializerSettings或其他内容中添加一些特殊内容,或者它不受支持?我已经尝试了其中的几个参数,比如TypeNameHandling和TypeNameAssemblyFormat,但都不起作用 正如所问,一些代码在外部库中声明: [Serializable]

我有一个要反序列化的对象,该对象在外部库中声明为struct(标记为可序列化)。但是,Json.net无法反序列化该对象。序列化很好,但反序列化不起作用。我已经尝试将struct更改为class,但没有效果。我是否需要在JsonSerializerSettings或其他内容中添加一些特殊内容,或者它不受支持?我已经尝试了其中的几个参数,比如TypeNameHandling和TypeNameAssemblyFormat,但都不起作用

正如所问,一些代码在外部库中声明:

[Serializable]
public struct BarEntry
{
    public RegistryValueKind One;
    public string Two;  
    public string Three;
    public string Four;
    public object Five;
}

[Serializable]
public struct FooEntry
{
    public string One;
    public string Two;
}
在自己的项目中序列化为:

Stream stream = System.IO.File.Open(fileName, FileMode.Create);
string json = JsonConvert.SerializeObject(entry, Formatting.None, new   JsonSerializerSettings { PreserveReferencesHandling = PreserveReferencesHandling.Objects });
StreamWriter streamWriter = new StreamWriter(stream);
streamWriter.Write(json);
streamWriter.Flush();
stream.Close();
StreamReader streamReader = new StreamReader(input);
string json = streamReader.ReadToEnd();
object returnObject = JsonConvert.DeserializeObject<T>(json);
input.Close();
return returnObject;
在自己的项目中反序列化为:

Stream stream = System.IO.File.Open(fileName, FileMode.Create);
string json = JsonConvert.SerializeObject(entry, Formatting.None, new   JsonSerializerSettings { PreserveReferencesHandling = PreserveReferencesHandling.Objects });
StreamWriter streamWriter = new StreamWriter(stream);
streamWriter.Write(json);
streamWriter.Flush();
stream.Close();
StreamReader streamReader = new StreamReader(input);
string json = streamReader.ReadToEnd();
object returnObject = JsonConvert.DeserializeObject<T>(json);
input.Close();
return returnObject;

您必须将确切的类型发送到JsonConvert.DeserializeObject,否则无法创建正确的对象,该对象将具有从json字符串反序列化所需的属性。因此,从外部程序集中加载此类型并将其发送到Json.NET。大概是这样的:

Assembly assembly = Assembly.LoadFile("ExternalAssembly.dll");
Type barEntryType = assembly.GetType("BarEntry");
var returnObject = JsonConvert.DeserializeObject(json, barEntryType);
或引用外部程序集,只需执行以下操作:

BarEntry returnObject = JsonConvert.DeserializeObject<BarEntry>(json)
BarEntry returnObject=JsonConvert.DeserializeObject(json)

您必须将确切的类型发送到JsonConvert.DeserializeObject,否则无法创建正确的对象,该对象将具有从json字符串反序列化所需的属性。因此,从外部程序集中加载此类型并将其发送到Json.NET。大概是这样的:

Assembly assembly = Assembly.LoadFile("ExternalAssembly.dll");
Type barEntryType = assembly.GetType("BarEntry");
var returnObject = JsonConvert.DeserializeObject(json, barEntryType);
或引用外部程序集,只需执行以下操作:

BarEntry returnObject = JsonConvert.DeserializeObject<BarEntry>(json)
BarEntry returnObject=JsonConvert.DeserializeObject(json)

已添加,请检查已编辑的起始帖子;)当您说“不起作用”时,实际发生了什么?“不起作用”=对象为空。添加,请检查编辑的开始帖子;)当你说“不起作用”时,实际发生了什么?“不起作用”=对象为空。谢谢你的回答,我已经尝试过了,但这不起作用(请参阅startpost,我就是这么做的)。你有object returnObject=JsonConvert.DeserializeObject(json);,还不清楚T是如何定义的。T是一个泛型类型,与您的“BarEntry”相同。谢谢您的回复,我已经尝试过了,但没有效果(请参阅startpost,我就是这么做的)。您有object returnObject=JsonConvert.DeserializeObject(json);,不清楚T是如何定义的,“T”是一个泛型类型,与“BarEntry”相同。