Actualmente estoy trabajando en el almacenamiento de estructuras de objeto más grandes que contienen todos los datos necesarios para un 'proyecto' en la aplicación en la que estoy trabajando. Los datos son cosas como imágenes, documentos de flujo así como los tipos de datos más básicos.Serialización de un objeto ISerializable que contiene otros objetos ISerializables
Ahora, mi enfoque actual ha sido implementar ISerializable en todas las clases que están contenidas dentro del objeto que necesito guardar. Sin embargo, cuando:
public class Profile : ISerializable
{
public ObservableCollection<Trade> Trades { get; set; }
public Profile() {}
public Profile(SerializationInfo info, StreamingContext context)
: this()
{
foreach (SerializationEntry entry in info)
{
if (entry.Name.StartsWith("trade"))
{
Type t = entry.ObjectType;
Trades.Add(entry.Value as Trade);
}
}
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
int i = 0;
foreach (Trade t in Trades)
{
info.AddValue("trade" + i, t, t.GetType());
i++;
}
}
}
plantea un problema. La Clase de Comercio que es lo que puebla mi Lista también implementa ISerializable. Entonces, lo que me pregunto es: ¿es este un buen enfoque? ¿Funciona? El código que he escrito hasta ahora no funciona, y todavía estoy tratando de resolver los problemas.
Más específicamente, la información.AddValue ("trade" + i, t, t.GetType()); usar los métodos 'ISerializables' de clase comercial? O quizás esta interfaz ni siquiera estaba pensada para tratar con este tipo de clases.
Así que si alguien fuera tan amable, y eche un vistazo y tal vez apunte en la dirección correcta cuando se trata de la serialización de cosas como estas.
Gracias!
Es más una pregunta general y no algo específico, y esto es solo un ejemplo de fragmento de código. Lo siento si no estaba claro. La pregunta: si tengo una clase en la que necesito hacer una serialización personalizada, y luego esa clase contiene objetos que también requieren serialización personalizada, ¿cómo lo manejo en el método GetObjectData? O tal vez eso ni siquiera es un problema? Preguntándose si tal vez algo como DataContractSerializer y cosas así se necesitan o no. Gracias – vesz
En general, cada clase debe estar a cargo de su propia serialización (personalizada o predeterminada) y las clases que contienen clases serializables no deberían necesitar saber o preocuparse por cómo se hace, está encapsulada. Es posible que tenga problemas debido a la serialización de ObservableCollection, y hay más información al respecto aquí: http://kentb.blogspot.com/2007/11/serializing-observablecollection.html. Si solo necesita serializar los Tipos, debería poder utilizar ObservableCollection.CopyTo() para obtener un Trade [] y agregarlo directamente a SerializationInfo. – SpeksETC
Gracias, eso es muy útil. CopyTo(), probablemente debería ser suficiente. No sabía que eso fuera posible. Pensé que tenía que serializar cada objeto de la lista individualmente si no eran los tipos básicos. – vesz