NetDataContractSerializer

NetDataContractSerializer

对于下面的NetDataContractSerializer msdn状态

“只有在序列化和反序列化端共享相同的CLR类型时,才可以使用NetDataContractSerializer”。

我的理解是,如果我使用NetDataContractSerializer在.net4.0中序列化了文件,后来又将所有代码转移到了.net4.5,那么即使代码相同,带有.net 4.0的文件也不会反序列化。

如果我的理解是错误的,请纠正我。

最佳答案

这取决于类型。 NetDataContractSerializer基于类型全类型名,可能符合程序集全名。例如,此代码:

List<string> list = new List<string>();
list.Add("joe");
list.Add("sam");

NetDataContractSerializer ser = new NetDataContractSerializer();
using (FileStream stream = File.OpenWrite("test.xml"))
{
    ser.Serialize(stream, list);
}


使用CLR 2编译将产生以下结果:

<ArrayOfstring z:Id="1" z:Type="System.Collections.Generic.List`1[[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]" z:Assembly="0" xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/"><_items z:Id="2" z:Size="4"><string z:Id="3">joe</string><string z:Id="4">sam</string><string i:nil="true"/><string i:nil="true"/></_items><_size>2</_size><_version>2</_version></ArrayOfstring>


而使用CLR 4编译的相同代码将产生以下结果:

<ArrayOfstring z:Id="1" z:Type="System.Collections.Generic.List`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]" z:Assembly="0" xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/"><_items z:Id="2" z:Size="4"><string z:Id="3">joe</string><string z:Id="4">sam</string><string i:nil="true"/><string i:nil="true"/></_items><_size>2</_size><_version>2</_version></ArrayOfstring>


如您所见,它们不兼容,因为它们包含System.String的程序集限定全名。因此,这取决于您的工作,但是很有可能无法按原样工作。我手头没有安装4.5,但您可以直接对其进行测试。

10-08 08:46