从XMLSerializer创建对象时初始化集合

时间:2010-12-09 17:43:59

标签: c# xmlserializer

我正在使用WCF DataContractSerializer来序列化和反序列化我的应用程序中的大对象图。我的问题是,如果我有一个在字段声明中初始化的集合,DataContractSerializer不会运行该初始化,并且集合最终为null。

例如:

class Test
{
    List<string> collection = new List<string>();

    public List<string> Collection 
    {
         get { return collection; } 
    }
}

序列化和反序列化此类后,该集合将为null而不是默认的new。如果我将初始化移动到属性get中,它就可以正常工作。

由于我有一个非常大的对象图,所以经历所有这些发生的地方相当费时。如果有办法以某种方式自动执行此操作,我更愿意。

更新:我正在使用WCF DataContractSerializer,所以我想这就是它没有初始化集合的原因。

常规XML Serializer可以处理递归引用,因为我在实体中有这些引用吗?

更新:好的,所以现在我被卡住......更具体地说,这些实体用于NHibernate,所以他们确实有DataContract / DataMember。但后来我使用IList作为BelongsTo / HasMany属性,而XMLSerializer也没有对它们进行序列化,并且没有递归引用,这也是不行的。

因此,假设我们有一个使用IList的类,并且具有递归引用,是否有一种方法可以序列化/反序列化它并仍然运行默认的对象构造函数?

更新:做了一些更多的测试,看起来我将不得不想出一个我自己的混合体,因为NH需要IList,这限制了我的DCS,以及它的标签问题...

2 个答案:

答案 0 :(得分:1)

XmlSerializer运行构造函数/字段初始化程序;写的代码应该没问题。您是否可能使用DataContractSerializer(即WCF)? (DCS 运行构造函数)。

WCF的一个方便的黑客是:

get {
    return list ?? ( list = new List<string>() );
}

答案 1 :(得分:0)

解决此问题的最简单方法是在默认构造函数中初始化集合。