有这样一个类:
public class ChapterCollection : ObservableCollection<ChapterVM>
{
public bool? IsSelectedAll
{
get { return _isSelectedAll; }
set
{
_isSelectedAll = value;
OnPropertyChanged(new PropertyChangedEventArgs(nameof(IsSelectedAll)));
}
}
}
当它被序列化为 XML 时,该属性IsSelectedAll不会被序列化。只有对象的集合ChapterVM。
如何序列化一个属性?
序列化是这样的:
public static void SerializeToXml(string path, object saveObject)
{
var formatter = new XmlSerializer(saveObject.GetType());
using (FileStream fs = new FileStream(path, FileMode.Create))
{
formatter.Serialize(fs, saveObject);
}
}
最简单的解决方案是放弃继承以支持组合。事实上,假设它
ChapterCollection不只是“是”一个集合是合乎逻辑的ChapterVM,而是包含一个集合ChapterVM和一些其他属性,作为选择集合元素等的标志。威胁。难怪聪明的设计书会写
如果您仍然打算离开继承,则必须实现该接口以覆盖序列化程序的操作
IXmlSerializable。你可以这样做:我将用组合的序列化选项来补充答案。
我们的集合类变成这样:
请注意,您必须手动创建一个实例,序列化程序无法创建“自定义”集合,因此不会填充它:
= new ObservableCollection<Chapter>();但
set;您不需要打开集合属性进行写入 ( )。现在您可以使用
Linq,但您必须指定此集合属性的名称:如果你实现
IEnumerable<>,那么序列化器将再次开始认为这是一个集合并丢失属性,此外,它会要求你实现一个非类型化方法Add(object),这已经很丑陋并增加了一些脆弱性。PS:感谢C#的duck typing,你仍然可以通过给类添加一个方法来加点糖:
虽然这不允许您在类的实例上使用 LINQ,但它会简化代码
foreach: