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

标签 c# serialization json.net

我有一个要反序列化的对象,它在外部库中声明为结构(标记为可序列化)。但是,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)

关于c# - 使用在外部库中声明的结构反序列化对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10482653/

相关文章:

c# - 我如何像类一样使用两个字典并将它们包装在一起?

c# - Json.NET 版本 4 中的 CamelCase 重大更改

c# - 以 PointF 为圆心绘制圆 c#

c# - Mongodb中BsonTimestamp构造函数的第二个参数increment是什么意思?

c# - 设置要在并行中使用的内核

C++几种对象序列化

javascript - 我如何仅使用 JavaScript 加载我的本地 json 文件

java - Scala 对象的序列化

c# - JSON.net 的新手,示例代码

c# - newtonsoft jobject.Value<DateTime>() 不起作用