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

时间:2012-05-07 13:07:11

标签: c# serialization json.net

我有一个我想要反序列化的对象,它在外部库(标记为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;

本项目中的所有内容都可以正常使用此代码,但是从外部库中无法反序列化对象(来自BarEntry和FooEntry)。

BarEntry和FooEntry也存储在其存储对象的同一属性中:

public object Entry { get; set; }

1 个答案:

答案 0 :(得分:0)

您必须将精确类型发送到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)