我正在使用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,以及它的标签问题...答案 0 :(得分:1)
XmlSerializer
运行构造函数/字段初始化程序;写的代码应该没问题。您是否可能使用DataContractSerializer
(即WCF)? (DCS 不运行构造函数)。
WCF的一个方便的黑客是:
get {
return list ?? ( list = new List<string>() );
}
答案 1 :(得分:0)
解决此问题的最简单方法是在默认构造函数中初始化集合。