12

オブジェクトをシリアル化したい場合は、[Serializable]属性を使用する必要があり、すべてのメンバー変数がファイルに書き込まれます。バージョン管理の方法がわかりません。たとえば、新しいメンバー変数を追加 (変数の名前を変更するか、変数を削除するだけ) してから、ファイルを開く (逆シリアル化する) 場合、オブジェクト/ファイルのバージョンをどのように判断して、正しく行うことができますか?新しいメンバーを設定するか、何らかの移行を行いますか? ロード中に変数が初期化されたかどうかを判断するにはどうすればよいですか (デシリアライザーによって無視されます)。

[OptionalField(VersionAdded = 1)]バージョントレラントなアプローチがあり、変数に属性をマークできることを知っています。古いファイルを開くと、フレームワークはこのオプション (新しい変数) を無視し、ゼロ/ヌルになります。しかし、変数がロードによって初期化されているか、無視されているかを判断するにはどうすればよいですか。

クラス/オブジェクトのバージョン番号をストリームに書き込むことができます。ISerializableアプローチを使用し、constructor(SerializationInfo oInfo, StreamingContext context)メソッドでこのバージョン番号を読み取ります。これにより、ストリーム内のクラスのバージョンが正確にわかります。

ただし、この種のバージョン管理は、C# のストリーミング フレームワークによって既に実装されていると予想していました。からアセンブリ バージョンを取得しようとしましたSerializationInfoが、オブジェクトが保存されたときに使用されたバージョンではなく、常に現在のバージョンに設定されています。

好ましいアプローチは何ですか?ネットでたくさんの記事を見つけましたが、バージョン管理に対処するための良い解決策を見つけることができませんでした...

どんな助けでも大歓迎ですありがとう、アビス

4

1 に答える 1

2

私が書いていることのいくつかがあまりにも明白であるならば、私を許してください、

まずはどうぞ!オブジェクトをシリアル化していると考えるのをやめなければなりません...オブジェクトの一部であるメソッドが永続化されていないため、これは単に正しくありません。あなたは情報を永続化しています-など..データのみ。

.NETシリアル化は、アセンブリ名とそのバージョンを含むオブジェクトの型名もシリアル化するため、逆シリアル化すると、永続化されたアセンブリ情報と、情報で明示される型とが比較されます-それらが同じでない場合は例外を返します。

バージョン管理の問題に加えて、すべてを簡単にシリアル化できるわけではありません.System.Drawing.Colorタイプをシリアル化してみると、.NETシリアル化の単純すぎるメカニズムの問題を理解し始めるでしょう.

進化する予定のない非常に単純なものをシリアル化する予定がない限り、.NET が提供するシリアル化メカニズムは使用しません。

あなたの質問に焦点を戻すと、バージョン管理の無視機能についてここで読むことができます: http://msdn.microsoft.com/en-us/library/ms229752(v=vs.80).aspxこれは BinaryFormatter に提供されています。

優れた機能を持つ XML Serialization も確認する必要がありますが、最大の利点は、人間が判読できる XML を取得できるため、型のバージョン管理が複雑な場合でもデータが失われることはありません。

しかし最後に、Database with Entity Framework を使用してデータを永続化するか、独自のフラット ファイル マネージャーを作成することをお勧めします。EF はほとんどのソリューションに非常に適していますが、非常に単純なものを永続化するために軽量なものが必要になる場合があります。(私の暗示は、.NET シリアライゼーションが関連する解決策が見当たらないということです。)

これがお役に立てば幸いです、頑張ってください。

于 2013-03-27T00:24:31.003 に答える