C# 当我重命名一个类时,我得到了一个反序列化错误。如何修复它?

C# 当我重命名一个类时,我得到了一个反序列化错误。如何修复它?,c#,.net,winforms,serialization,C#,.net,Winforms,Serialization,我将类classBattle重命名为Game,而不是“无法加载类型battle.classBattle+udtCartesian需要反序列化” 这是代码行MapSize=(Game.udtCartesian)格式化程序 我该如何解决这个问题?这是否意味着我不能重命名类?在序列化时,如果不使用约定,则类的名称是其中的一部分,因此反序列化类名需要相同 您可以更改类名,再次序列化和反序列化,而不会出现问题 不起作用的是使用一个名称序列化并尝试反序列化回另一个名称 除此之外,请使用契约和使用它们的格式化

我将类
classBattle
重命名为
Game
,而不是“无法加载类型battle.classBattle+udtCartesian需要反序列化”

这是代码行
MapSize=(Game.udtCartesian)格式化程序


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

在序列化时,如果不使用约定,则类的名称是其中的一部分,因此反序列化类名需要相同

您可以更改类名,再次序列化和反序列化,而不会出现问题

不起作用的是使用一个名称序列化并尝试反序列化回另一个名称


除此之外,请使用契约和使用它们的格式化程序。

BinaryFormatter
是脆弱的,并且不是为了友好而设计的。如果需要这种类型的行为,则需要基于约定的序列化程序,如
XmlSerializer
DataContractSerializer
或protobuf-net。除了BinaryFormatter

之外,您还可以使用
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;
    }
}
要反序列化,只需设置
BinaryFormatter
Binder
属性:

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

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

为完整起见,您可以使用“序列化代理”解决此问题,但这是一项繁杂而艰巨的工作。最好首先从基于契约的序列化程序开始。此外,只要使用
[TypeForwardedTo]
,就可以移动类型(在程序集之间),但重命名并不容易。我需要先学习如何使用XmlSerialize进行序列化。我正在尝试修改以学习策略游戏编程。地图编辑器使用BinaryFormatter。我本来打算发布一个答案,但我会听从Marc(谁写的!)。