Me doy cuenta de que ha sido bien establecido en otros lugares que la serialización de objetos de dominio NHibernate es generalmente una mala idea. Mi pregunta aquí es para tratar de entender cómo funciona BinaryFormatter
, y por qué el escenario siguiente produce el InvalidCastException
.¿Por qué BinaryFormatter intentará convertir un objeto del tipo marcado [Serializable] en IConvertible?
La estructura de clases más o menos se parece a esto:
[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; }
}
El método de serialización es el siguiente:
public static byte[] Serialize(this object t)
{
using (var ms = new MemoryStream())
{
BinarySerializer.Serialize(ms, t);
return ms.ToArray();
}
}
A veces cuando se llama a la serialización por ejemplo,
Parent p = new Parent() ....;
p.Serialize();
voy a tener
No se puede convertir objeto de tipo 'NHibernate.Collection.Generic.PersistentGenericBag`1 [Juguete]' al tipo 'System.IConvertible'.
(todas las colecciones están mapeadas con la semántica del bolso).
Incluso NHibernate.Collection.Generic.PersistentGenericBag<T>
está marcado [Serializable]
Por lo tanto, dado que todo lo que aquí se marca como [Serializable]
¿por qué BinaryFormatter
estar intentando echar a un PersistentGenericBag
IConvertible en el primer lugar?
Editar: En caso de que sea relevante, esto está bajo .NET 3.5 y 3.1.0 NHibernate
Usted dice que esto ocurre "a veces" al serializar - es el código utilizado en una aplicación multi-hilo? – LukeH
Se usa en una aplicación web, pero en el escenario que estoy viendo, creo que probablemente no sea un problema de concurrencia. Parece que es más probable que esté relacionado con la carga diferida. – Nathan