【问题标题】:When I renamed a class I am getting a deserialization error. How to fix it?当我重命名一个类时,我得到一个反序列化错误。如何解决?
【发布时间】:2011-02-03 20:19:45
【问题描述】:

我将类 classBattle 重命名为 Game,但没有收到“无法加载类型 Battle.classBattle+udtCartesian 需要进行反序列化。”

这是MapSize = (Game.udtCartesian)formatter.Deserialize(fs);这行代码

我该如何解决这个问题?这是否意味着我不能重命名课程?

【问题讨论】:

  • 为了完整起见,您可能可以使用“序列化代理”来解决此问题,但这是一项繁琐且艰苦的工作。最好首先从基于合约的序列化程序开始。此外,只要使用 [TypeForwardedTo],就可以移动类型(在程序集之间)——但重命名并不容易。
  • 我需要先学习如何使用 XmlSerialize 进行序列化。我正在尝试修改codeproject.com/KB/game/BattleField.aspx 来学习策略游戏编程。地图编辑器使用 BinaryFormatter。

标签: c# .net winforms serialization


【解决方案1】:

如果不使用契约进行序列化,类的名称是其中的一部分,因此反序列化的类名需要相同。

您可以更改类名,再次序列化和反序列化没有问题。

用一个名称序列化并尝试反序列化回另一个名称是行不通的。

除此之外,使用合同和使用它们的格式化程序。

【讨论】:

    【解决方案2】:

    BinaryFormatter 很脆弱,并且不是为友好而设计的 if you have changes to the types involved。如果你想要这种类型的行为,你需要一个基于契约的序列化程序,例如XmlSerializerDataContractSerializer 或 protobuf-net。除了BinaryFormatter之外的任何东西。

    【讨论】:

    【解决方案3】:

    您还可以使用SerializationBinder 来定义在反序列化另一种类型的情况下将加载哪种类型:

    public sealed class Version1ToVersion2DeserializationBinder : SerializationBinder
    {
        public override Type BindToType(string assemblyName, string typeName)
        {
            Type typeToDeserialize = null;
    
            if (typeName == "OldClassName")
                typeName = "NewClassName";
    
            typeToDeserialize = Type.GetType(String.Format("{0}, {1}",
                                                typeName, assemblyName));
    
            return typeToDeserialize;
        }
    }
    

    要反序列化,您只需设置BinaryFormatterBinder 属性:

    formatter.Binder = new Version1ToVersion2DeserializationBinder();
    NewClassName obj = (NewClassName)formatter.Deserialize(fs);
    

    【讨论】:

      【解决方案4】:

      如果您不关心保存的数据,只需删除文件,新文件将使用新名称保存。

      【讨论】:

        猜你喜欢
        • 2022-01-17
        • 2022-09-07
        • 1970-01-01
        • 2021-09-19
        • 2020-01-22
        • 2018-03-09
        • 1970-01-01
        • 2018-01-19
        相关资源
        最近更新 更多