我使用二进制序列化保存数据。现在我已经将程序中的一个字段从Int32更改为struct。但我仍然希望将字段保存为Int32以向后兼容。我该怎么做?
背景信息 我的程序从Delphi移植并使用了很多数组。问题是Delphi中的列表从1开始计数,当我现在用C#开发时,vilkort很难跟踪索引。所以我使用一个结构来更容易处理基于1的索引基于0的数组,直到我纠正了整个程序。
代码
public void Save()
{
using (var writer = File.Open(Path, FileMode.Create))
{
var serializer = new BinaryFormatter();
serializer.Serialize(writer, _data);
}
}
private void Load()
{
using (var reader = File.Open(Path, FileMode.Open))
{
var deserializer = new BinaryFormatter();
_data = (Foo) deserializer.Deserialize(reader);
}
}
public struct Indexer
{
//0-baserat index
private int _index;
public Indexer(int index)
{
_index = index;
}
static public implicit operator Indexer(int index)
{
return new Indexer(index);
}
static public implicit operator int(Indexer indexer)
{
return indexer._index;
}
public override string ToString()
{
return (_index + 1).ToString();
}
...
}
答案 0 :(得分:0)
我想唯一的方法就是拥有两个类 - 一个使用struct,另一个使用int32。 然后,您可以在序列化后将一个转换为另一个。明确指出,没有向后兼容性。
答案 1 :(得分:0)
int n = YourStruct.SomeIntVar;
Marshal.WriteInt32(hBuffer, n);
我不确定这是否适用于您的情况,因为它取决于您将数据序列化为档案的方式。如果您直接操作内存中的数据或共享内存(hBuffer),上面的代码片段应该会有所帮助。
答案 2 :(得分:0)
您可以添加Int32类型的旧字段,也可以使用struct字段。使用[OnDeserialized]属性(和正确的参数)创建一个方法,并在某些情况下从int字段初始化struct字段,例如int字段非零,并且结构在反序列化后具有默认值,表明数据是从较旧的格式。
private int intValue; // Legacy field
private SomeStruct structValue; // New field
[OnDeserialized]
private void OnDeserialized(StreamingContext context)
{
if (intValue != 0)
{
// Old format, initialize struct with int value.
structValue = new SomeStruct(intValue);
}
}
这不是很优雅,还有其他方法,但如果你不介意保留两个字段,这是一种更简单的方法。请注意,上面的代码假定零表示旧int字段的“缺失”值。
答案 3 :(得分:0)
这将允许您控制序列化/反序列化过程。