当我重命名一个类时,我得到一个反序列化错误。怎么解决?

时间:2010-04-02 19:12:06

标签: c# .net winforms serialization

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

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

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

4 个答案:

答案 0 :(得分:4)

BinaryFormatter很脆弱,并不是友好的if you have changes to the types involved。如果您需要这种类型的行为,则需要基于合同的序列化程序,例如XmlSerializerDataContractSerializer或protobuf-net。除BinaryFormatter以外的任何内容。

答案 1 :(得分:4)

您还可以使用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;
    }
}

要反序列化,您只需设置Binder的{​​{1}}属性:

BinaryFormatter

答案 2 :(得分:1)

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

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

什么是行不通的是使用一个名称序列化并尝试反序列化为另一个名称。

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

答案 3 :(得分:0)

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