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(谁写的!)。