Бинарные объекты и десериализация
Невозможно десериализовать следующий граф объектов. Это исключение возникает, когда метод десериализации, называемый BinaryFormmater:
System.Runtime.Serialization.SerializationException:
The constructor to deserialize an object of type 'C' was not found.
На C. есть два конструктора, и я думаю, что проблема может быть следующей: в процессе сериализации Binaryformatter с использованием параметризованного и в процессе десериализации он нуждается в без параметров. Есть ли взлом/решение?
Объекты:
[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));
}
}
//Успех сериализации
byte[] result;
using (var stream =new MemoryStream())
{
new BinaryFormatter ().Serialize (stream, source);
stream.Flush ();
result = stream.ToArray ();
}
return result;
//Снятие десериализации
object result = null;
using (var stream = new MemoryStream(buffer))
{
result = new BinaryFormatter ().Deserialize (stream);
}
return result;
Вызовы в той же среде, тот же поток, тот же метод
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
Ответы
Ответ 1
Я подозреваю, что вам просто нужно предоставить конструктор десериализации для C
, поскольку словарь реализует ISerializable
:
protected C(SerializationInfo info, StreamingContext ctx) : base(info, ctx) {}
checked (pass):
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
}
}
Ответ 2
Ваша сериализация будет успешной, если вы реализуете класс C следующим образом:
[Serializable]
public class C : IDictionary<int,A>
{
private Dictionary<int,A> _inner = new Dictionary<int,A>;
// implement interface ...
}
Проблема заключается в сериализации класса, основанного на словарях.