次のメソッドを使用して、.NETオブジェクトをシリアル化および逆シリアル化します。
public static string SerializeToBase64(object data)
{
var stream = new MemoryStream();
var formatter = new BinaryFormatter();
formatter.Serialize(stream, data);
stream.Position = 0;
return Convert.ToBase64String(stream.ToArray());
}
public static object DeserializeFromBase64(string data)
{
var stream = new MemoryStream(Convert.FromBase64String(data));
stream.Position = 0;
var formatter = new BinaryFormatter();
return formatter.Deserialize(stream);
}
これらのメソッドは、[Serializable]属性でマークされた単純なクラスを操作するときに正常に機能するようです。
ただし、このコードを使用して、ORMフレームワークによって作成されたエンティティクラス(Serializableとしても作成)をシリアル化する必要があります。これにより、各エンティティクラスは、ソースコードがない基本クラスから派生します。
エンティティクラスのインスタンスを操作する場合、例外なしでシリアル化を完了しますが、formatter.Deserialize()を実行すると、逆シリアル化は常にnull参照例外をスローします。
私はシリアル化のプロセスにあまり精通していませんが、この問題はターゲットオブジェクトの状態の異常が原因であると考えられます。シリアル化の前にオブジェクトが満たさなければならない標準の基準セットはありますか?
他のデバッグの提案をいただければ幸いです。
ありがとう、ティム
アップデート:
さらに実験を重ねた結果、問題の原因を発見したと思います。この投稿で説明されているように、ターゲットオブジェクトには、シリアル化可能としてマークされていない別のクラスによって処理されるイベントがあります。
興味深いのは、イベントハンドラーが接続されていても、シリアル化が正しく機能することです。逆シリアル化が失敗します。
ただし、イベントハンドラーを一時的に削除してテストしたところ、シリアル化と逆シリアル化の両方が正しく機能するため、これが問題であると思います。ただし、イベントが宣言されているコードにアクセスできないため、上記のソリューションを実装する方法をすぐに理解することはできません。シリアル化プロセスを変更して、イベントハンドラーを削除してから復元する必要がある場合があります。