1

我使用二进制序列化保存数据。现在我已经将程序中的一个字段从 Int32 更改为一个结构。但我仍然想将该字段保存为 Int32 以向后兼容。我怎么做?

背景信息 我的程序是从 Delphi 移植过来的,使用了很多数组。问题是Delphi中的列表是从1开始计数的,在我现在用C#开发的时候,vilkort让跟踪索引变得很困难。所以我使用了一个struct来更容易处理从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();
    }

    ...
  }
4

4 回答 4

0

我想唯一的方法是有两个类——一个是struct,一个是int32。然后,您可以在序列化后将一个转换为另一个。明确指出,不存在向后兼容性。

于 2011-08-01T08:39:02.763 回答
0
 int n = YourStruct.SomeIntVar;
 Marshal.WriteInt32(hBuffer, n);

我不确定这是否适用于您的情况,因为这取决于您如何将数据序列化为档案。如果您直接操作内存或共享内存 (hBuffer) 上的数据,上述代码段应该会有所帮助。

于 2011-08-01T08:47:07.883 回答
0

您可以添加 Int32 类型的遗留字段,也可以添加 struct 字段。制作一个带有 [OnDeserialized] 属性(以及正确的参数)的方法,在某些情况下从 int 字段初始化 struct 字段,例如 int 字段为非零且反序列化后 struct 具有默认值,表示数据为从旧格式。

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 字段的“缺失”值。

于 2011-08-01T08:50:41.403 回答
0

ISerializerSurrogate

这将允许您控制序列化/反序列化过程。

于 2011-08-01T08:51:06.427 回答