【发布时间】:2017-12-23 04:28:06
【问题描述】:
我有一些具有树节点结构的类。它具有用于隐藏直接更改子项的只读集合类型的 Children 属性和用于控制子项添加的 AddChild(...) 方法。
class TreeNode {
List<TreeNode> _children = new List<TreeNode>();
public IReadOnlyList<TreeNode> Children => children;
public string Name { get; set; } // some other filed
public void AddChild(TreeNode node){
// ... some code
_children.Add(node);
}
}
我需要为我的班级提供反序列化。我试过了:
[Serializable]
[XmlRoot(ElementName = "node")]
class TreeNode {
List<TreeNode> _children = new List<TreeNode>();
[XmlElement(ElementName = "node")]
public IReadOnlyList<TreeNode> Children => children;
[XmlAttribute(DataType = "string", AttributeName = "name")]
public string Name { get; set; } // some other filed
public void AddChild(TreeNode node){
// ... some code
_children.Add(node);
}
public static TreeNode Deserialize(Stream stream) {
var serializer = new XmlSerializer(typeof(TreeNode));
var obj = serializer.Deserialize(stream);
var tree = (TreeNode)obj;
return tree;
}
}
当然,这不起作用,因为 IReadOnlyList 没有 Add 方法。
是否可以将 AddChild 绑定到反序列化过程?如果“是” - 如何?
如何提供具有反序列化能力的相同封装级别?
【问题讨论】:
-
为什么它是
ReadOnlyList?为什么不直接将其设为private List<T>,然后公开可以添加到其中的AddChild方法? -
你应该看
ISerializable界面。 msdn.microsoft.com/en-us/library/… -
@CihanYakar
XmlSerializer不关心ISerializable,而IXmlSerializable很难正确实现
标签: c# .net serialization deserialization encapsulation