私は、あなたのNHibernateドメインオブジェクトをシリアライズすることは、一般的には悪い考えであることが他のところでは確立されていることを認識しています。ここで私の質問は、BinaryFormatter
の仕組みを理解しようとすることで、なぜ以下のシナリオでInvalidCastException
が得られるのかを理解しようとしています。なぜBinaryFormatterは[Serializable]とマークされた型のオブジェクトをIConvertibleにキャストしようとしますか?
クラス構造は、おおよそ次のようになります。シリアル化などを呼び出すときに時々
public static byte[] Serialize(this object t)
{
using (var ms = new MemoryStream())
{
BinarySerializer.Serialize(ms, t);
return ms.ToArray();
}
}
:シリアル化の方法は、次のようになります
[Serializable]
public class Parent
{
public virtual Child child{get; set;}
}
[Serializable]
public class Child
{
public virtual ICollection<GrandChild> GrandChildren { get; set; }
}
[Serializable]
public class GrandChild
{
public virtual Pet pet{get; set;}
}
[Serializable]
public class Pet
{
public virtual IList<Toy> Toys { get; set; }
}
[Serializable]
public class Toy
{
public string ToyName { get; set; }
}
Parent p = new Parent() ....;
p.Serialize();
私は 'System.IConvertible' を入力するタイプ 'NHibernate.Collection.Generic.PersistentGenericBag`1 [玩具]' のオブジェクトをキャストすること
ができないでしょう。
(すべてのコレクションはバッグセマンティクスでマップされています)。
はさえNHibernate.Collection.Generic.PersistentGenericBag<T>
は、だからここにすべてがなぜBinaryFormatter
最初の場所でIConvertibleにPersistentGenericBag
をキャストしようとするだろう[Serializable]
としてマークされていることを考えると[Serializable]
をマークされていますか?
編集:場合、それは、関連するだ、これはSystem.Runtime.Serialization.ISerializableからペットクラスの継承を有することにより、.NET 3.5とNHibernateは3.1.0
これは、マルチスレッドアプリケーションで使用されているこのコードはシリアル化するときに「時には」発生すると言いますか? – LukeH
これはWebアプリケーションで使用されていますが、私が見ているシナリオでは、おそらく並行性の問題ではないと思います。遅延読み込みに関連する可能性が高いようです。 – Nathan