我有一种方法来序列化实现ICollection的类的公共属性

时间:2013-05-29 09:24:31

标签: c# .net xml-serialization

为方便起见,我有一个实现ICollection的类。当类被序列化为XML时,将跳过所有公共属性,并且仅序列化实际集合。我从MSDN中读到以下内容

  

实现ICollection或IEnumerable的类。

     
      
  • 仅序列化集合,而不是公共属性。
  •   

有没有解决这个问题?有没有办法让一个实现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或创建日期时间。我希望能够在代码的某些部分以相同的方式处理我的批处理和我的其他集合,因为我关心的是一个集合并且有一个计数。我不在乎某些信息与该集合中的每个项目都相同。

我想要这样做的原因是为了序列化。我试图删除多余的信息。如果有另一种方式来构建我的课程,我不会失去那么重要的计数,那么我就是全部的耳朵。我希望避免创建另一个只包含这样一个简单事物计数的接口。它感觉很脏,但它可能是正确的。

2 个答案:

答案 0 :(得分:3)

不,基本上。这不是XmlSerializer所独有的 - 框架的大部分内容将集合元素视为互斥。我的建议是:不要那样做。有一些 集合 xor 元素。

这并不意味着格式必须更改 - 您通常可以封装列表(而不是 列表)并使用[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>

答案 1 :(得分:0)

在这种情况下,您必须自己实施IXmlSerializable。有关此问题的更多信息,请查看at MSDN和/或此SO answer