【发布时间】:2019-12-11 07:58:45
【问题描述】:
每当我尝试从 json 反序列化类时,只要序列化数据包含派生类型,就会出错。我的最终目标是能够存储各种派生类型,所以这是一个问题。当我在序列化的对象中仅存储非派生类型时,不会发生该错误。对于添加上下文,代码是使用 Revit 的 AddinManager 扩展运行的加载项的一部分。
(根据建议,我重新编写了代码以尝试隔离问题并给出更易于传达的描述。我已将代码更改为使用两个简单的类。)
更改后我现在得到错误:
JSON 'AddinNamespace.ToyNodePlus, AddinAssemblyName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' 中指定的类型与'AddinNamespace.ToyNode, AddinAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken'不兼容=空'。路径“TestNode.$type”,第 1 行,位置 61。
插件设置
namespace AddinNamespace
{
public class AddinSettings
{
public const string Filename = "AddinSettings.json";
public ToyNode TestNode;
}
}
ToyNode 和 ToyNodePlus 定义
namespace AddinNamespace
{
public class ToyNode
{
public string Name;
}
public class ToyNodePlus : ToyNode
{
public int AdditionalValue;
}
}
序列化代码
private JsonSerializerSettings serializerSettings = null;
private void OnAddinStart(){
serializerSettings = new JsonSerializerSettings()
{
TypeNameHandling=TypeNameHandling.Auto,
TypeNameAssemblyFormatHandling = TypeNameAssemblyFormatHandling.Simple
};
if(File.Exists(AddinSettings.Filename)){
string fileContents = File.ReadAllText(AddinSettings.Filename);
AddinSettings settings = JsonConvert.DeserializeObject<AddinSettings> (fileContents, serializerSettings);
//do work with settings here
}
}
//code for saving to Json (code appears to be working as expected)
private void OnAddinFinish(){
AddinSettings settings = new AddinSettings();
settings.TestNode = new ToyNodePlus() {AdditionalValue = 7, Name= "This is a test" };
string fileContents = JsonConvert.SerializeObject(settings, serializerSettings);
File.WriteAllText(AddinSettings.Filename, fileContents);
}
创建的 Json 文件内容
{"TestNode":{"$type":"AddinNamespace.ToyNodePlus, AddinAssembly","AdditionalValue":7,"Name":"This is a test"}}
【问题讨论】:
-
最后一段代码 sn -p 中的设置是什么?
-
你是如何定义对象列表的?你能发布
settings的结构/类定义吗? -
确实,如果您可以包含minimal reproducible example,这样会更容易为您提供帮助。
-
我已经编辑了这个问题,希望更容易重现。
-
它仍然不是minimal reproducible example。我不能只是复制、粘贴、编译、运行和查看问题。我可以从你这里得到的 sn-ps 构建所有东西,但是当你可以做到 一次并最终得到一个更清晰的问题。
标签: c# json json.net revit-api