序列化和反序列化后的对象引用

时间:2011-03-03 13:22:32

标签: c#-4.0

为什么在反序列化之后,对象引用与在冻结之前不同。

好的,让我解释一下

我有一个字符串

string test =“TestString”;

现在我做了Serilization

                  DataContractJsonSerializer _DataContractJsonSerializer
          = new DataContractJsonSerializer(typeof(string));

                       MemoryStream ms = new MemoryStream();
            _DataContractJsonSerializer.WriteObject(ms, test);
            var jsonString = Encoding.Default.GetString(ms.ToArray());

现在我从jsonstring做DeSerilization到实际值

        MemoryStream ms1 =
            new MemoryStream(Encoding.Unicode.GetBytes(jsonString));
            DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(string));
            string DeseriliaedStrring = serializer.ReadObject(ms1) as string;

这里在DeseriliaedStrring我得到了实际价值,但如果我检查参考他们不相等

bool isReferenceEqual = object.ReferenceEquals(DeseriliaedStrring, test);

2 个答案:

答案 0 :(得分:2)

序列化会创建对象值的副本。反序列化使用复制的值创建一个全新的实例。

编辑以响应下面的评论:反序列化不会调用构造函数。如果这是一个问题,请使用ISerializable覆盖。这将根据对ISerializable.GetObjectData的调用进行序列化,然后使用SerializationInfoStreamingContext字段调用特定构造函数。

答案 1 :(得分:1)

序列化和反序列化对象时,反序列化将在序列化数据上创建实例。这当然与原始实例不同,这似乎是合乎逻辑的。毕竟,您有以下过程:

  • 您有一个对象实例
  • 您创建一个表示该对象实例的字符串实例
  • 您可以根据字符串
  • 中的序列化数据创建对象实例

如果考虑到原始实例可能已经发生变异,那么反序列化可能发生在另一个进程中,即使在另一个进程中也是如此,反序列化很可能无法返回原始实例。

在这种特殊情况下,当对象是String时,您可以想象字符串实习将使系统重用旧实例(如果反序列化发生在同一AppDomain中)。但这可能*需要DataContractJsonSerializer才能意识到这一点,这会使其变得不必要地复杂。

*)我实际上并不确定 系统中负责字符串实习的部分。