1

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

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

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

不幸的是,这些对象在 Web 服务中使用,因此被(反)序列化,并且所有设置器都被调用,而 PropertyLoaded 在实际上没有被调用时被调用。

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

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

4

1 回答 1

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,但这只能作为最后的手段。这不好玩。

于 2010-03-24T12:43:04.517 回答