自定义结构,以便将其序列化为Int32

时间:2011-08-01 08:27:21

标签: c# serialization c#-4.0 binary-serialization

我使用二进制序列化保存数据。现在我已经将程序中的一个字段从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();
    }

    ...
  }

4 个答案:

答案 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)

ISerializerSurrogate

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