Выполняя DeSerialise с использованием BinaryFormatter, я обнаруживаю, что получаю правильный тип объекта.

Как BinaryFormatter сохраняет нужный объект, даже если объект унаследован от другого объекта? Как создать нужный объект в DeSerialise?

Пример :

[Serializable]
public class Class1
{
    public string Id { get; set; }
    public int Age { get; set; }
}

[Serializable]
public class Class2 : Class1
{
    public string Id1 { get; set; }
    public int Age1 { get; set; }
}

BinaryFormatter bf = new BinaryFormatter();

Class1 c1 = new Class1();
Class2 c2 = new Class2();

byte[] c1Bytes;
byte[] c2Bytes;

using (MemoryStream ms = new MemoryStream())
{
    bf.Serialize(ms, c2);
    c2Bytes = ms.GetBuffer();
}

using (MemoryStream ms = new MemoryStream(c2Bytes))
{
    var t = bf.Deserialize(ms);

    string rr = t.ToString();    // rr contain "Class2" 

}
c#
-1
Yanshof 1 Май 2016 в 14:11

2 ответа

Лучший ответ

Поскольку BinaryFormatter хранит информацию о типе в сериализованных данных. Вы можете проверить спецификацию формата здесь

2
Jcl 1 Май 2016 в 11:17

Проверьте содержимое байтов c2 (используйте средство просмотра памяти Visual Studio для переменной c2 bytes) и Google .net reflection

2
zeromus 1 Май 2016 в 11:16