gpt4 book ai didi

c# - 反序列化 .NET 中已更改的类的策略

转载 作者:太空狗 更新时间:2023-10-29 21:35:27 25 4
gpt4 key购买 nike

我有这门课

[Serializable]
public class myClass() : ISerializable
{
public int a;
public int b;
public int c;

public void GetObjectData(SerializationInfo info,
StreamingContext context)
{
// Some code
}

public myClass(SerializationInfo info,
StreamingContext context)
{
// Some code
}
}

我的数据库中有数百个这样的对象。我现在准备发布我的应用程序的新版本,其中的类已变形为

[Serializable]
public class myClass() : ISerializable
{
public int a;
public string b;
public int c;
public bool d;

public void GetObjectData(SerializationInfo info,
StreamingContext context)
{
// Some code
}

public myClass(SerializationInfo info,
StreamingContext context)
{
// Some code
}
}

如何使用第二个反序列化构造函数反序列化基于第一个版本序列化的对象。

是否还有 future 版本验证我的类(class)的第二个版本的策略?

最佳答案

如果您没有准备,您可能需要求助于 hack:当您的 public myClass 反序列化构造函数获取 bool d 的值时,将代码包含在 try/catch,捕获异常时将d设为默认值。

将来,添加一个 int"__ver"(或任何其他不会与您传递给 info.AddValue< 的参数冲突的名称),并将其设置为您在类中维护的常量,以指示序列化中兼容和不兼容的更改:

public class myClass : ISerializable {
private const int __ver = 4;
public int a;
public string b;
public int c;
public bool d;

public void GetObjectData(SerializationInfo info,
StreamingContext context) {
info.AddValue("__ver", ver);
info.AddValue("a", a);
// and so on
}

public myClass(SerializationInfo info,
StreamingContext context) {
switch(info.GetInt32("__ver")) {
case 3:
// Deserialize prior version
break;
case 4:
// Deserialize current version
break;
}
}
}

关于c# - 反序列化 .NET 中已更改的类的策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10237887/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com