2010-11-28 14 views
5

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!

Respuesta

2

No estoy seguro de cuál es exactamente el problema aquí (si puede publicar la clase Trade y detalles sobre qué es exactamente lo que no funciona, sería útil), pero en general si la clase Trade es serializable, debería poder agregue el atributo [Serializable] a la clase de perfil y no necesita hacer una serialización personalizada implementando ISerializable.

Normalmente solo necesita implementar ISerializable cuando necesita hacer una serialización personalizada (por ejemplo, cuando sus miembros de datos no son serializables).

Edición: Acaba de darse cuenta de que está utilizando un ObservableCollection por lo que mi comentario anterior de simplemente usar el atributo [Serializable] no es correcto. Consulte aquí para obtener información sobre la serialización de ObservableCollection: http://kentb.blogspot.com/2007/11/serializing-observablecollection.html o también debería poder usar ObservableCollection.CopyTo() para obtener una instancia Trade [] y agregarla directamente a SerializationInfo.

+0

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

+0

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

+0

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

Cuestiones relacionadas