对于下面的NetDataContractSerializer msdn状态
“只有当序列化和反序列化端共享相同的NetDataContractSerializer类型时,才能使用CLR”。
我的理解是,如果我使用NetDataContractSerializer在.net4.0中序列化文件,然后将所有代码转移到.net4.5,那么即使代码相同,使用.net 4.0的文件也不会被反序列化。
如果我的理解有误,请纠正我。
发布于 2012-06-11 18:44:19
这取决于类型。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版的安装程序,但你可以直接测试它。
发布于 2012-06-11 18:20:51
由于DotNet是基于COM技术的,我相信DotNet4.0和DotNet4.5是二进制兼容的,这意味着它们具有相同的CLR类型,并且将被反序列化。
你可以看看这里:MSDN blog on compatibility of Framework 4.5
https://stackoverflow.com/questions/10978000
复制相似问题