6

我觉得这是一个转贴,但我似乎找不到任何关于它的好信息。我只是想知道序列化实际上是如何工作的(实际上是反序列化)。我想知道的是,如果说我有一个实际上不受私有字段支持的属性;IE:

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

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

4

3 回答 3

8

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

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

如果您正在使用数据合同序列化(DataContractSerialization),那么如果您将 DataMember 属性应用于属性(而不是其支持字段),则将调用 getter/setter。

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

于 2009-01-21T19:30:50.050 回答
0

您是在谈论 XML 序列化还是“常规”序列化(soap / 二进制),因为-afaik- 这两种序列化技术不同。

AFAIK,如果您使用 BinaryFormatter 或 SoapFormatter,则字段是序列化/反序列化的,而不是属性。
在反序列化时,我相信使用了具有 SerializationInfo 和 StreamingContext 参数的特殊 2-arg 构造函数。

但是,没有什么能阻止您通过实现 ISerializable 接口来控制序列化过程。然后,如果您希望使用您的属性设置您的值,我认为您可以完美地做到这一点。

于 2009-01-21T19:31:28.833 回答
0

我知道这不是您问题的直接答案,您已经得到了您正在寻找的答案。但我不想隐瞒这一点。您可以使用Reflector查看基类库源代码。这是了解更多关于 .net 框架内部结构和拓宽知识的绝佳方式。

于 2009-01-21T19:35:00.917 回答