泛型树结构子节点列表的反序列化问题

shangwg 2020-01-02 03:05:15
我定义了基础的树结构,为了便于扩展,使用了泛型:
节点:
public class Node{
public string ID{get;set;}
public string Description{get;set;}
public IList<Node> Children;//------问题出在这里
}

树对象:
public class Tree<T>:Node,where T:Node{
......树对象的各种方法
}


实际使用时,比如菜单如下定义:
protected Tree<MenuItem> menus;

序列化时正常:
{"Parent":null,"Children":[{"Parent":null,"Children":[{"Parent":null,"Children":null,"ID":"Menu","Description":"菜单设置","Index":0,"IsValid":false},{"Parent":null,"Children":null,"ID":"Setup","Description":"系统配置","Index":0,"IsValid":false}],"ID":"Web","Description":"Web控制台","Index":0,"IsValid":false}],"ID":null,"Description":null,"Index":0,"IsValid":false}

但是在反序列化时,由于节点的Children定义为IList<Node>
System.Text.Json反序列化实例时使用了Node对象,并非MenuItem对象。

请问该怎么定义Node类,才能在后续扩展中顺利使用MenuItem呢?
...全文
159 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
shangwg 2020-01-04
  • 打赏
  • 举报
回复
的确
var node = JsonConvert.DeserializeObject<MenuItem>(json);
是可以序列化到指定的对象类型。但对于一个树结构(MenuItem类型是从Node类型扩展而来),node的Children,子节点在此时由于定义为 IList<Node>,会被序列化为Node而不是MenuItem。除非被覆盖定义为:IList<MenuItem>。这样一来,所有扩展Node的对象都要覆盖下Children属性,失去了继承的意义。

现在我尝试用容器方式来做,还没完成验证(比如RPC传输是否有其他问题,实例化对应的数据库结构问题)
正怒月神 2020-01-03
  • 打赏
  • 举报
回复
引用 2 楼 shangwg 的回复:
在反序列化时,子节点得到的对象就是Node,无法转换为MenuItem 目前的写法: public class MenuItem:Node { } 可以想到的解决办法: public class MenuItem:Node{ public new IList<MenuItem> Children;//------覆盖父类的Children,不过这显然违背了继承的思路,不如每个不同的类都单独写算了 }
你直接这样呢 var node = JsonConvert.DeserializeObject<MenuItem>(json);
shangwg 2020-01-02
  • 打赏
  • 举报
回复
在反序列化时,子节点得到的对象就是Node,无法转换为MenuItem
目前的写法:
public class MenuItem:Node
{
}
可以想到的解决办法:
public class MenuItem:Node{
public new IList<MenuItem> Children;//------覆盖父类的Children,不过这显然违背了继承的思路,不如每个不同的类都单独写算了
}
正怒月神 2020-01-02
  • 打赏
  • 举报
回复
额。。。本来就不是一个类型的。 那你自己转换成Node后,在树洞转换为Tree<MenuItem>

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧