4

と を使用してBinaryFormatterオブジェクトMemoryStreamをシリアル化し、バイナリ BLOB としてデータベースに格納しています。次に、データベースからデータを取得し、binaryformatter とメモリ ストリームを使用して逆シリアル化します。

ただし、オブジェクトを逆シリアル化しようとすると、例外がスローされることがよくあります。最も注目すべきは'an object with the same key already exists'、または'cannot convert string to int64'

デシリアライズが失敗する理由について誰かが考えを持っていますか? または、どの辞書オブジェクトに問題があるかを調べる方法はありますか?

私のシリアル化機能は次のとおりです...

private byte[] SerializeUserData(UserData ud)
{
    byte[] data = null;
    using (MemoryStream ms = new MemoryStream())
    {
        ms.Seek(0, SeekOrigin.Begin);
        BinaryFormatter bf = new BinaryFormatter();
        bf.Serialize(ms, ud);
        data = ms.ToArray();
    }
    return data;
}

private UserData Deserialize()
{
    UserData ud = null;
    using (MemoryStream ms = new MemoryStream(mSession.BinarySession))
    {
        BinaryFormatter bf = new BinaryFormatter();
        ud = bf.Deserialize(ms) as UserData;
    }
    return ud; 
}

UserData クラスは少しモンスターですが、[serializable] とマークされており、そのオブジェクト ツリー内のすべてのクラスも [serializable] とマークされています。このクラスの一部は次のとおりです。

[Serializable]
public class UserData
{
        public UserData() { Clear(); }
        public Guid Id { get; set; }

        public Account Account { get; set; }
        public List<Account> OldAccounts{ get; set; }

        public void Clear()
        {
          Account = null;
          OldAccounts = new List<Account>();
          Id = Guid.NewGuid();
        }
}
4

1 に答える 1

5

フレームワークの最近のバージョンではこれを試していませんが、経験則はおそらくまだ良いと思います。自動プロパティで BinaryFormatter を使用しないでください。

問題は、BinaryFormatter がバッキング フィールドを使用し、シリアライゼーション/デシリアライゼーションを行うためのプロパティを使用しないことです。自動プロパティの場合、バッキング フィールドはコンパイル時に生成されます。また、毎回同じであることを保証するものではありません。これは、オブジェクトを逆シリアル化し、入力したものを正確に取得できないことを意味する可能性があります。

詳細については、次を参照してください:自動プロパティと BinaryFormatter

于 2010-12-17T19:16:01.197 に答える