3

私が持っているとしましょう

List<object> mainList = new List<object>();

そして、それは含まれています

List<string> stringList = new List<string();
List<CustomClass> custList = new List<CustomClass>();
mainList.Add(stringList);
mainList.Add(custList);

シリアライズするには

Stream stream;
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, mainList);

逆シリアル化するには

Stream stream = (Stream)o;
BinaryFormatter formatter = new BinaryFormatter();
List<object> retrievedList = (List<object>)formatter.Deserialize(stream);

この時点で、ストリームの読み取り (デシリアライズ) が値を取得せずにストリームの最後に達したというエラーが表示されます。

他に何か指定する必要がありますか...

[Serializable]
public class CustomClass { .... }

これを機能させるためのカスタムクラスで?毎回異なるタイプのオブジェクトを含む List> をデシリアライズできませんか?

私は試した

IList list = (IList)Activator.CreateInstance(typeof(custClassList[0]))

これを送受信しようとしましたが、同じ問題が発生しました。

ただし、指定した型またはリストをシリアル化および逆シリアル化することはできますが、動的にする必要があります。

4

2 に答える 2

3

基本的に、BinaryFormatter は冗談です。場合によっては機能しますが、ほとんど同じシナリオでは不明な理由で失敗します。

BinaryFormatter の最良かつ優れた代替手段は、Marc Gravelによって開発されたサードパーティ ライブラリprotobuf-net ( https://github.com/mgravell/protobuf-net )です。

この美しさは、私が抱えていたすべての問題を 1 回のパスで解決しました。セットアップがはるかに簡単で、複雑なカスタム クラスに対してより完全に反応します。

また、デシリアライゼーションに関しては、より高速であることにも言及する必要があります。

于 2013-09-24T18:40:40.443 に答える
1

「ストリーム読み取り (デシリアライゼーション) がストリームの終わりに達しました」というエラーを引き起こす問題を修正するには、次のようにストリーム位置を 0 にリセットする必要があります...

stream.Position = 0;

他に何か指定する必要がありますか...

[シリアライズ可能] public class CustomClass { .... }

いいえ...それはあなたがやっていることにとって良いはずです。

これを機能させるためのカスタムクラスで?毎回異なるタイプのオブジェクトを含む List> をデシリアライズできませんか?

任意のオブジェクトをシリアル化できる必要があります。

于 2013-09-18T15:41:19.040 に答える