我有一种方法来序列化实现ICollection的类的公共属性
作者:互联网
为了方便起见,我有一个实现ICollection的类.当类被序列化为XML时,所有公共属性都将被跳过,只有实际的集合被序列化.我从MSDN阅读以下内容
Classes that implement ICollection or IEnumerable.
- Only collections are serialized, not public properties.
是否有任何解决方法?有没有一种方法可以实现ICollection并且仍将输出公共属性?还是我必须使用XmlWriter自己做?
万一需要一个例子.
public class Batch: ICollection<Foo>
{
public string Bar { get; set; }
public int Baz { get; set; }
public List<Foo> Foos { get; private set; }
public IEnumerator<Foo> GetEnumerator()
{
return Foos.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return Foos.GetEnumerator();
}
public void Add(Foo item)
{
Foos.Add(item);
}
public void Clear()
{
Foos.Clear();
}
public bool Contains(Foo item)
{
return Foos.Contains(item);
}
public void CopyTo(Foo[] array, int arrayIndex)
{
Foos.CopyTo(array, arrayIndex);
}
public bool Remove(Foo item)
{
return Foos.Remove(item);
}
public int Count { get { return Foos.Count; } }
public bool IsReadOnly { get { return false; } }
}
之所以这样,是因为在我的代码的另一部分中,我正在处理事物的集合. IList IList等.但是对于该批次,有一些信息适用于每个Foo,但是对于一个特定的批次,每个foo的信息都是相同的.像批次ID或Created DateTime.我希望能够在代码的某些部分中以相同的方式处理我的批处理和其他集合,因为我所关心的只是一个集合并且有计数.我不在乎某些信息是否与该收藏集中的每个项目相同.
我想要这样做的原因是为了序列化.我试图删除多余的信息.如果还有另一种安排班级结构的方法,而我又不会失去那非常重要的一环,那么我会不知所措.我希望避免创建另一个仅包含像这样的简单计数的接口.感觉很脏,但这可能是对的.
解决方法:
不,基本上.这不是XmlSerializer独有的-框架的大部分将集合和元素视为互斥的.我的建议:不要那样做.有的东西要么是集合x要么是元素.
这并不意味着格式必须更改-您通常可以封装一个列表(而不是列表),并使用[XmlElement(“ someName”)]获得相同类型的输出,例如:
public class PeopleWrapper
{
[XmlAttribute("someValue")]
public int SomeValue { get; set; }
private readonly List<Person> people = new List<Person>();
[XmlElement("person")]
public List<Person> Items { get { return people; } }
}
那么如果另一个班级有:
public PeopleWrapper People { get; set; }
您将在xml中获得:
<People someValue="123">
<person>...</person>
<person>...</person>
<person>...</person>
</People>
标签:xml-serialization,c,net 来源: https://codeday.me/bug/20191123/2066064.html