2009-01-21 47 views
5

我有一种感觉,这是一个转发,但我似乎无法找到任何有关它的好消息。我只是想知道序列化是如何工作的(实际上是反序列化)。我想知道的是,如果说我有一个实际上没有私人领域支持的财产,即:序列化如何在.Net中工作

public string SomeProp { 
    get { 
     return GetValue("SomePropKey"); 
    } 
    set{ 
     SetValue("SomePropKey", value); 
    } 
} 

当我反序列化setter被调用? getter被调用序列化,因为当我序列化对象时,正确的值被写入输出流。我知道这似乎是一个奇怪的情况,但究竟发生了什么?或者我只是过分复杂这....

回答

7

它完全取决于您用于序列化的机制。

如果你使用的是XmlSerialization,那么是的,setter被调用。

如果使用数据协定序列化(DataContractSerialization),那么如果将D​​ataMember属性应用于属性(而不是其后台字段),则会调用getter/setter。

如果您在.NET中使用原始序列化机制(IFormatter实现),那么这种情况是不可能的,因为它只会序列化存储在字段中的值。

+0

谢谢,我们正在使用XmlSerialization。对不起,我没有包括这一点。并再次感谢你! – 2009-01-21 19:32:02

0

你是在谈论XML序列化,还是'常规'序列化(soap/binary),因为-afaik-这两种序列化技术是不同的。 AFAIK,如果您使用BinaryFormatter或SoapFormatter,则字段将被序列化/反序列化,而不是属性。
关于反序列化,我相信使用具有Seri​​alizationInfo & StreamingContext参数的特殊2参数构造函数。

但是,没有什么能阻止你通过实现ISerializable接口来控制序列化过程。 然后,如果你希望你的价值是使用你的财产设定的,我认为你完全可以这样做。

0

我知道它不是你的问题的直接答案,你已经得到了你正在寻找的答案。但我不想保留这一点。您可以使用Reflector查看基类库资源。这是了解更多关于.net框架内部结构并扩展知识的绝佳方式。