XmlSerializer和OnSerializing / OnSerialized替代品

时间:2010-03-24 11:15:50

标签: c# .net xmlserializer

我有各种复杂的对象,通常有其他复杂对象的集合。有时我只想在需要时加载集合,所以我需要一种方法来跟踪集合是否已被加载(null / empty并不一定意味着它没有被加载)。为此,这些复杂对象从维护已加载集合集合的类继承。然后我们只需要在setter中为我们想要跟踪的每个集合添加一个函数调用,如下所示:

public List<ObjectA> ObjectAList {
    get { return _objectAList; }
    set { 
        _objectAList = value; 
        PropertyLoaded("ObjectAList");
    }
}

PropertyLoaded函数更新一个集合,用于跟踪已加载的集合。

不幸的是,这些对象在web服务中使用,因此(de)序列化并调用所有setter,并且实际上没有调用PropertyLoaded。

理想情况下,我希望能够使用OnSerializing / OnSerialized,因此函数知道它是否被合法地调用,但是我们使用XmlSerializer,所以这不起作用。尽管我想改为使用DataContractSerializer,但出于各种原因我目前还不能这样做。

还有其他方法可以知道序列化是否正在发生?如果不是或者替代方案是否有更好的方法来实现上述目的而无需每次需要跟踪新集合时都需要额外的代码?

1 个答案:

答案 0 :(得分:3)

XmlSerializer不支持序列化回调。不过,你有一些选择。例如,如果要选择是否序列化名为ObjectAList的属性,可以添加方法:

public bool ShouldSerializeObjectAList () { /* logic */ }

如果您在反序列化过程中也需要知道,可以使用:

[XmlIgnore]
public bool ObjectAListSpecified {
    get { /* logic whether to include it in serialization */ }
    set { /* logic to apply during deserialization */ }
}

(虽然您可能会发现 - 我无法确定 - set仅针对true案例进行调用)

另一个选择当然是实现IXmlSerializable,但这应该只作为最后的手段来完成。这不好玩。