首页 新闻 会员 周边

一个关于父类子类,序列化反序列化的问题

0
悬赏园豆:5 [已解决问题] 解决于 2017-06-23 16:40

直接上代码:

    public class BaseCard
    {
        public virtual int ID { get; set; }
    }
    public class Card1 : BaseCard
    {
        public int CID1 { get; set; }
    }
    public class Card2 : BaseCard
    {
        public int CID2 { get; set; }
    }
    public class Test
    {
        public List<BaseCard> List { get; set; }
    }

上面定义4个类,下面是应用:

 var t = new Test();
            t.List = new List<BaseCard>();
            t.List.Add(new Card1 { ID = 1, CID1 = 99 });
            t.List.Add(new Card2 { ID = 2, CID2 = 88 });
            var s = JsonConvert.SerializeObject(t);
            var t2 = JsonConvert.DeserializeObject<Test>(s);

问题来了,t2里面的List里面的实例已经不是子类了,子类的数据也没了。

我要的结果是序列化是什么样数据,反序列化回来还是怎么样的数据

拖鞋王子的主页 拖鞋王子 | 初学一级 | 园豆:37
提问于:2017-05-12 22:01
< >
分享
最佳答案
0

JSON序列化的特点是节省字符长度,并且javascript是动态类型的,对于类没有啥敏感度,只要字段属性名对得上就行。

这种情况使用JSON。

而如果你希望在C#里面操作,希望保留完整的类信息,这时候使用XML序列化是一个更好的选择。

开着法拉利,非要给法拉利加个功能,能越野。

开着悍马,却想和跑车比快,这都是好奇怪的做法。

收获园豆:5
爱编程的大叔 | 高人七级 |园豆:30844 | 2017-05-13 10:18
其他回答(2)
0

需要保存子类信息.直接这样操作是不行.

比如用一个字段保留类型信息

https://github.com/wrx362114/EasyMQService/blob/master/src/ES.Framework/RabbitMQ/EventHandler/TimedTaskHandler.cs

这个33行的做法就是.

吴瑞祥 | 园豆:29449 (高人七级) | 2017-05-12 22:51
0

我之前遇到过类似的问题,做了一个模块https://www.npmjs.com/package/esserializer,可以在序列化/反序列化过程中保留父类子类信息。

cshao | 园豆:202 (菜鸟二级) | 2021-02-02 16:10
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册