为什么在反序列化之后,对象引用与在冻结之前不同。
好的,让我解释一下
我有一个字符串
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);
答案 0 :(得分:2)
序列化会创建对象值的副本。反序列化使用复制的值创建一个全新的实例。
编辑以响应下面的评论:反序列化不会调用构造函数。如果这是一个问题,请使用ISerializable
覆盖。这将根据对ISerializable.GetObjectData
的调用进行序列化,然后使用SerializationInfo
和StreamingContext
字段调用特定构造函数。
答案 1 :(得分:1)
序列化和反序列化对象时,反序列化将在序列化数据上创建实例。这当然与原始实例不同,这似乎是合乎逻辑的。毕竟,您有以下过程:
如果考虑到原始实例可能已经发生变异,那么反序列化可能发生在另一个进程中,即使在另一个进程中也是如此,反序列化很可能无法返回原始实例。
在这种特殊情况下,当对象是String
时,您可以想象字符串实习将使系统重用旧实例(如果反序列化发生在同一AppDomain中)。但这可能*需要DataContractJsonSerializer
才能意识到这一点,这会使其变得不必要地复杂。
*)我实际上并不确定 系统中负责字符串实习的部分。 子>