我有一些树节点结构的类。它具有儿童属性,只读集合类型用于隐藏直接更改子项和添加子控件的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'?为什么不把它变成一个私人列表'然后公开可以添加到它的'AddChild'方法? –
JonE
你应该看看'ISerializable'接口。 https://msdn.microsoft.com/en-us/library/system.runtime.serialization.iserializable%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396 –
@CihanYakar'XmlSerializer'不关心关于'ISerializable'和'IXmlSerializable'很难正确实现 –