2013-03-26 11 views
11

オブジェクトをシリアル化する場合は、[Serializable]属性を使用し、すべてのメンバー変数がファイルに書き込まれます。たとえば、私はバージョン管理の仕方を知らない。新しいメンバ変数を追加(変数の名前を変更するか変数を削除する)した後、ファイルを開く(デシリアライズする)場合、どのようにオブジェクト/ファイルのバージョンを決定すれば新しいメンバーを正しく設定できるか、ロード中に変数が初期化されたかどうかは、どのように判断できますか(デシリアライザでは無視されます)。C#でのシリアライゼーションとオブジェクトのバージョン管理

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

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

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

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

すべてのヘルプは おかげで、 アビス

答えて

2

を高く評価している私を許して何Iのいくつかの場合書き込みがあまりにも明白です

まずは、どうぞ!オブジェクトをシリアライズしていると思うのをやめなければなりません。 オブジェクトの一部であるメソッドが永続化されていないため、単純に間違っています。 情報を永続化しています。

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

バージョニングの問題のほかに、すべてが簡単にシリアライズできるわけではありません。System.Drawing.Color型をシリアル化しようとすると、単純化された.NETシリアル化のメカニズムに関する問題を理解し始めます。

本当にシンプルなものを進化させる計画がない限り、私は.NETで提供されるシリアライズメカニズムを使用しません。

あなたの質問に焦点を戻して、ここでバージョン管理の無知能力についてお読みください: http://msdn.microsoft.com/en-us/library/ms229752(v=vs.80).aspx BinaryFormatterのために提供されています。

また、XMLシリアライゼーションには優れた機能がいくつかありますが、最大の利点は、人間が読めるXMLを取得することで、タイプのバージョン管理が複雑になってもデータが失われないことです。

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

私はこれが役立つことを祈っています。

+1

+1は、.NETのシリアル化とは異なるアプローチを使用することを提案しています。 – Theraot

関連する問題