1

バイナリ シリアル化を使用してデータを保存します。ここで、プログラム内のフィールドを Int32 から構造体に変更しました。しかし、下位互換性を保つために、フィールドを Int32 として保存したいと考えています。それ、どうやったら出来るの?

背景情報 私のプログラムは Delphi から移植されており、多くの配列を使用しています。問題は、Delphi のリストが 1 からカウントを開始することです。現在 C# で開発しているときに、vilkort によってインデックスを追跡することが難しくなりました。プログラム全体を修正するまで、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

唯一の方法は、構造体を持つクラスと int32 を持つクラスの 2 つのクラスを持つことだと思います。シリアル化後に、一方を他方に変換できます。下位互換性はないと明示的に述べられています。

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

データをアーカイブにシリアル化する方法に依存するため、これがあなたのケースで機能するかどうかはわかりません。メモリまたは共有メモリ (hBuffer) 上のデータを直接操作する場合は、上記のスニペットが役立ちます。

于 2011-08-01T08:47:07.883 に答える
0

Int32 型のレガシー フィールドを追加でき、構造体フィールドも使用できます。[OnDeserialized] 属性 (および正しい引数) を持つメソッドを作成し、一部の状況下で 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);
  }
}

これは正確にはエレガントではなく、他の方法もありますが、2 つのフィールドを保持することを気にしない場合は、これがより簡単な方法の 1 つです。上記のコードは、ゼロが古い int フィールドの「欠落」値を示すと想定していることに注意してください。

于 2011-08-01T08:50:41.403 に答える
0

ISerializerSurrogate

これにより、シリアライゼーション/デシリアライゼーション プロセスを制御できます。

于 2011-08-01T08:51:06.427 に答える