【问题标题】:NetDataContractSerializer and CLR typesNetDataContractSerializer 和 CLR 类型
【发布时间】:2012-06-14 05:36:48
【问题描述】:

对于下面的 NetDataContractSerializer msdn 状态

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

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

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

【问题讨论】:

    标签: c# netdatacontractserializer


    【解决方案1】:

    这取决于类型。 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 的设置,但你可以直接测试它。

    【讨论】:

    • 可能当你在设置new NetDataContractSerializer { AssemblyFormat = FormatterAssemblyStyle.Simple}之后在反序列化中使用时不会有问题
    【解决方案2】:

    由于 DotNet 是基于 COM 技术的,我认为 dotnet 4.0 和 dotnet 4.5 是二进制兼容的,这意味着它们具有相同的 CLR 类型并且将被反序列化。

    你可以看看这里:MSDN blog on compatibility of Framework 4.5

    【讨论】:

      猜你喜欢
      • 2020-06-16
      • 1970-01-01
      • 2011-01-23
      • 1970-01-01
      • 2011-12-14
      • 2017-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多