首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用特定的派生类反序列化对象的属性

如何用特定的派生类反序列化对象的属性
EN

Stack Overflow用户
提问于 2020-07-08 18:06:40
回答 2查看 202关注 0票数 3

我需要Asp.net来用特定的派生类反序列化对象的属性。

根据Newtonsoft的文档,我应该能够更改基类JsonContract的Equipment.Shared.Model.SimCard。https://www.newtonsoft.com/json/help/html/ContractResolver.htm

类发送器有一个属性(Simcard) Equipment.Shared.Model.SimCard,但是我需要将它反序列化为TlsModel.SimCard,否则在反序列化过程中会丢弃TlsModel.SimCard属性。

代码语言:javascript
复制
public class TlsModelContractResolver : DefaultContractResolver
{
    protected override JsonContract CreateContract(Type objectType)
    {
        JsonContract contract = base.CreateContract(objectType);

        if (objectType == typeof(Equipment.Shared.Model.SimCard) )
        {
            contract.CreatedType = typeof(SimCard);
            Console.WriteLine("Simcard CreateType is updated");

        }

        return contract;
    }
}

在第一次反序列化时,我有日志行'Simcard CreateType是更新‘,所以我的合同沙漠被考虑在内。

但transmitter.SimCard仍然是一个Equipment.Shared.Model.SimCard,而不是Equipment.Shared.Model.SimCard,正如我所强调的那样。

我错过了什么吗?

EN

回答 2

Stack Overflow用户

发布于 2020-07-08 20:35:29

还必须用适当的创建函数替换JsonContract.DefaultCreator的值,如果基类没有公共构造函数,则可能设置JsonContract.DefaultCreatorNonPublic = false

代码语言:javascript
复制
public class TlsModelContractResolver : DefaultContractResolver
{
    protected override JsonContract CreateContract(Type objectType)
    {
        JsonContract contract = base.CreateContract(objectType);

        if (objectType == typeof(Equipment.Shared.Model.SimCard) )
        {
            contract.CreatedType = typeof(SimCard);
            Debug.WriteLine("Simcard CreateType is updated");
            contract.DefaultCreator = () => new SimCard();
            contract.DefaultCreatorNonPublic = false;
        }

        return contract;
    }
}

备注:

演示小提琴这里

票数 3
EN

Stack Overflow用户

发布于 2020-07-08 18:49:29

如果使用newtonsoft,可以使用(在序列化和反序列化类型下)类型名称处理(如下面所解释的:https://www.newtonsoft.com/json/help/html/SerializeTypeNameHandling.htm )。

它只是将属性"@type“添加到每个对象。

示例

请考虑以下课程:

代码语言:javascript
复制
//dll My.Dll
namespace My.Namespace
public class MyObj {
    public string Name {get;set;}
    public object Whatever {get;set;}
}

var objInner = new MyObj { Name = "Inner" };
var objOuter = new MyObj { Name = "Outer", Whatever = obj1 }

var jsonString = JsonConvert.SerializeObject(objOuter, Formatting.Indented, new 
JsonSerializerSettings
{
    TypeNameHandling = TypeNameHandling.All
});
Console.Writeline(jsonString);

//produces
//{
//  "@type": "My.Namespace.MyObj, My.Dll",
//  "Name":  "Outer",
//  "Whatever": {
//       "@type": "My.Namespace.MyObj, My.Dll",
//       "Name": "Inner"
//   }
//}

//to deserialize
var deserializedObj = JsonConvert.DserializeObject<MyObj>(objOuter, new 
JsonSerializerSettings
{
    TypeNameHandling = TypeNameHandling.All
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62800996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档