- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我目前在尝试创建类更新程序时遇到困难。
有一个可序列化的 ClassA,它包含一个 Integer 和一个 String 变量。 ClassA 被转换为对象,序列化然后保存到二进制文件。之后有一个程序更新,将 ClassA 更改为包含两个 Integer 和 String 变量。旧的 ClassA 重命名为 ClassA_0。当数据从二进制文件中加载回来时,反序列化的对象作为参数传递给更新程序方法。
问题是:我如何将那个对象与ClassA_0 和ClassA 进行比较以确定它被保存为的“版本”?
编辑:
[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/
所以我有这个 UltraTicTacToe 游戏,我正在用 HTML/CSS/JS 编码。它由表中表中的表组成。当您单击 X 或 O 时,我想要突出显示您应该进入的下一个 TicTacToe 牌 ta
Some text Some more text 如何让每个 .example 的 .whatever 包含其 .test 的内容? 例如,如果代码是这样的: Som
我是一名优秀的程序员,十分优秀!