Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XmlSerializer和onserialize/OnSerialized替代方案_C#_.net_Xmlserializer - Fatal编程技术网

C# XmlSerializer和onserialize/OnSerialized替代方案

C# XmlSerializer和onserialize/OnSerialized替代方案,c#,.net,xmlserializer,C#,.net,Xmlserializer,我有各种各样的复杂对象,它们通常有其他复杂对象的集合。有时我只想在需要时加载集合,因此我需要一种跟踪集合是否已加载的方法(null/empty并不一定意味着它尚未加载)。为此,这些复杂对象从维护已加载集合集合的类继承。然后,我们只需要在setter中为每个要跟踪的集合添加一个函数调用,如下所示: public List<ObjectA> ObjectAList { get { return _objectAList; } set { _objectA

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

public List<ObjectA> ObjectAList {
    get { return _objectAList; }
    set { 
        _objectAList = value; 
        PropertyLoaded("ObjectAList");
    }
}
公共列表对象主义者{
获取{return\u objectAList;}
集合{
_反对者=价值;
不动产抵押(“反对者”);
}
}
PropertyLoaded函数更新一个集合,该集合跟踪已加载的集合

不幸的是,这些对象在Web服务中被使用,因此被(反)序列化,所有setter都被调用,PropertyLoaded在实际上还没有被调用时被调用

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


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

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