首先,有一种方法可以序列化实现iccollection的类的公共属性

本文关键字:iccollection 序列化 实现 属性 方法 一种 首先 | 更新日期: 2023-09-27 18:15:55

为方便起见,我有一个实现iccollection的类。当类被序列化为XML时,所有的公共属性都被跳过,只有实际的集合被序列化。我从MSDN

中读到以下内容

实现icollections或IEnumerable的类。

    只有集合被序列化,而不是公共属性。

有办法解决这个问题吗?有没有一种方法来实现一个类的集合,仍然会输出公共属性?还是我必须使用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; } }
}

这样做的原因是,在我的代码的另一部分,我正在处理事物的集合。等等。但是对于批处理,有一些信息适用于每个Foo,但是对于一个特定批处理的每个Foo,这些信息是相同的。比如批处理ID或已创建日期时间。我希望能够在代码的某些部分以相同的方式处理我的批处理和其他集合,因为我所关心的只是一个集合和一个计数。我不关心某些信息是否与集合中的每一项都相同。

我这样做的原因是为了序列化。我试图删除多余的信息。如果有其他的方法来组织我的课程,我不会失去这个非常重要的数字,那么我洗耳恭听。我希望避免为这样一个简单的事情创建另一个只包含计数的接口。感觉很脏,但也许是对的。

首先,有一种方法可以序列化实现iccollection的类的公共属性

基本上没有。这并不是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>

在这种情况下,您必须自己实现IXmlSerializable。关于这方面的更多信息,请查看MSDN和/或这个SO答案