gpt4 book ai didi

c# - 比较包含同一组变量/属性的不同类

转载 作者:太空宇宙 更新时间:2023-11-03 12:28:05 25 4
gpt4 key购买 nike

我目前在尝试创建类更新程序时遇到困难。

有一个可序列化的 ClassA,它包含一个 Integer 和一个 String 变量。 ClassA 被转换为对象,序列化然后保存到二进制文件。之后有一个程序更新,将 ClassA 更改为包含两个 IntegerString 变量。旧的 ClassA 重命名为 ClassA_0。当数据从二进制文件中加载回来时,反序列化的对象作为参数传递给更新程序方法。

问题是:我如何将那个对象ClassA_0ClassA 进行比较以确定它被保存为的“版本”?

编辑:

[Serializable]
public class ClassA
{
int VarA;
int VarB;
string VarC;


public ClassA()
{
//[...]
}

public void MethodX()
{
//[...]
}
}

[Serializable]
public class ClassA_0
{
int VarA;
string VarB;


public ClassA()
{
//[...]
}

public void MethodX()
{
//[...]
}
}

这些是虚拟类,所以我没有在构造函数或方法中指定任何代码。

最佳答案

如果是我,我会看看像 protobuf-net 这样的工具(偏见:我是作者,但是:全部免费等),它可以让您更好地控制这些东西。然后我会做类似的事情:

[ProtoContract]
public class ClassA
{
[ProtoMember(1)
int Version { get { return 1; } set {} }

[ProtoMember(2)]
int VarA;
[ProtoMember(3)]
int VarB;
[ProtoMember(4)]
string VarC;


public ClassA()
{
//[...]
}

public void MethodX()
{
//[...]
}
}

[ProtoContract]
public class ClassA_0
{
[ProtoMember(1)
int Version { get { return 2; } set {} }

[ProtoMember(2)] // this is the same - compatible, keep tag
int VarA;
[ProtoMember(5)] // not the same: new tag
string VarB;


public ClassA()
{
//[...]
}

public void MethodX()
{
//[...]
}
}

注意标签 1 中有一个虚拟属性只有一个 get并忽略值 - 这确保我们使用数据序列化一个版本以供以后查找(因为你想要)。我们可以也添加一个 set这会引发有关版本的错误,但我宁愿使其尽可能兼容。

VarA在两者中都存在并且兼容 - 我们可以为此使用标签 2。其他数据不兼容,因此使用新的不同标签 (5);现在我们可以使用 Serializer.Deserialize<ClassA>(...) ,或 Serializer.NonGeneric如果您愿意,可以等效,并且数据应该反序列化。但我们也可能只想检查版本 - 我们可以这样做:

[ProtoContract]
public class VersionInfo {
[ProtoMember(1)]
public int Version {get;set;}
}

现在我们可以使用Serializer.Deserialize<VersionInfo> 在相同的数据上,它只会反序列化版本标签并丢弃其他所有内容。一旦我们知道了版本,我们就可以分支等等。这可以通过某种形式的继承来完成,但在这里似乎有点过分了。

关于c# - 比较包含同一组变量/属性的不同类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43870114/

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