我有一个要反序列化的对象,它在外部库中声明为结构(标记为可序列化)。但是,Json.net 无法反序列化此对象。序列化很好,但反序列化不起作用。我已经尝试将结构更改为类,但没有帮助。我是否需要在 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;
自己的项目中的所有内容都可以使用此代码正常工作,但是从外部库中它无法反序列化对象(从BarEntry和FooEntry)。
此外,BarEntry 和 FooEntry 都存储在其存储对象的同一属性中:
public object Entry { get; set; }
您必须将确切的类型发送到 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)