c# binaryformatter

c# - Objetos BinaryFormatter y Deserialization Complex



(2)

Sospecho que solo necesita proporcionar un constructor de deserialización a C , ya que el diccionario implementa ISerializable :

protected C(SerializationInfo info, StreamingContext ctx) : base(info, ctx) {}

comprobado (pasa):

static void Main() { C c = new C(); c.Add(123, new A { ID = 456}); using(var ms = new MemoryStream()) { var ser = new BinaryFormatter(); ser.Serialize(ms, c); ms.Position = 0; C clone = (C)ser.Deserialize(ms); Console.WriteLine(clone.Count); // writes 1 Console.WriteLine(clone[123].ID); // writes 456 } }

No se puede deserializar el siguiente gráfico de objetos. Esa excepción ocurre cuando se llama al método deserialize en BinaryFormmater: System.Runtime.Serialization.SerializationException:

The constructor to deserialize an object of type ''C'' was not found.

Hay dos constructores en C. y creo que el problema puede ser: aunque la serialización Binaryformatter usa el paramaterizado y el proceso de deserialización, necesita uno sin parámetros. ¿Hay un hack / solución? Objetos :

[Serializable] public class A { B b; C c; public int ID { get; set; } public A() { } public A(B b) { this.b = b; } public A(C c) { this.c = c; } } [Serializable] public class B { } [Serializable] public class C : Dictionary<int, A> { public C() { } public C(List<A> list) { list.ForEach(p => this.Add(p.ID, p)); } }

// Serialización de éxito

byte[] result; using (var stream =new MemoryStream()) { new BinaryFormatter ().Serialize (stream, source); stream.Flush (); result = stream.ToArray (); } return result;

// Deserialización falla

object result = null; using (var stream = new MemoryStream(buffer)) { result = new BinaryFormatter ().Deserialize (stream); } return result;

Las llamadas están en el mismo entorno, mismo hilo, mismo método

List<A> alist = new List<A>() { new A {ID = 1}, new A {ID = 2} }; C c = new C(alist); var fetched = Serialize (c); // success var obj = Deserialize(fetched); // failes


Su serialización tendrá éxito cuando implemente la clase C de la siguiente manera:

[Serializable] public class C : IDictionary<int,A> { private Dictionary<int,A> _inner = new Dictionary<int,A>; // implement interface ... }

El problema es la serialización de la clase derivada del Diccionario.