2016-06-15 3 views
0

Является ли утверждение в вопросе правильным?BinaryFormatter обрабатывает больше случаев, чем XmlSerializer?

Например, кажется, что нет никакого способа, чтобы сериализовать код ниже (массив смешанных типов) с XmlSerializer в то время как BinaryFormatter работает просто отлично:

using System.IO; 

[Serializiable] 
class ParentCls 
{ 
    int k; 
} 

[Serializiable] 
class X : ParentCls 
{ 
    string name = "foobar"; 
} 

[Serializiable] 
class Y : ParentCls 
{ 
    double price = 32.0; 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     ParentCls[] data = new ParentCls[] { new X(), new Y() }; 
     using (Stream stream = File.Open("tmp.bin", FileMode.Create)) 
     { 
      var binaryFormatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); 
      binaryFormatter.Serialize(stream, data); 
     } 
    } 
} 

Существуют случаи, когда XmlSerialiser может делать то, что BinaryFormatter не может do (т. е. где использование XmlSerialiser - единственный способ)?

ответ

0

Нет, это неправильно. Зависит от многих обстоятельств. В некоторых случаях BinaryFormatter более удобен, в других - XmlSerializer.


XmlSerializer может сериализовать массив смешанных типов. Для этого вам необходимо использовать атрибут XmlInclude следующим образом.

[XmlInclude(typeof(X))] 
[XmlInclude(typeof(Y))] 
public class ParentCls 
{ 
    public int k; 
} 

public class X : ParentCls 
{ 
    public string name = "foobar"; 
} 

public class Y : ParentCls 
{ 
    public double price = 32.0; 
} 

Пожалуйста, обратите внимание, что вы должны использовать модификатор общего доступа, что является серьезным ограничением XmlSerializer.

Пример использования

ParentCls[] data = new ParentCls[] { new X(), new Y() }; 
var xs = new XmlSerializer(typeof(ParentCls[])); 

using (Stream stream = File.Open("tmp.xml", FileMode.Create)) 
    xs.Serialize(stream, data); 
1

Я не знаю, что существуют структурные ограничения - где типа не могут быть представлены либо сериализации технологии. Однако существуют сценарии, где xml-сериализация проще, чем с двоичной сериализацией ... по этой причине: двоичная сериализация переносит информацию о типе, а сериализация xml - нет. Сериализация Xml ближе к так называемой утиной печати в этом отношении. Да, имена элементов и пространства имен предоставляют подсказки, но не требования.

Зачем это важно? Наиболее часто используемая ситуация заключается в том, что контракт на сериализацию соответствует одному типу на клиенте, а другой совершенно другой тип на сервере ... тот, который разделяет формат сериализации (имя и члены одного типа). Это не редкость с сериализатором данных (сериализатор xml) и WCF. Стоит отметить, что в сценариях, где вам необходимо поддерживать контракты данных для нескольких версий контракта на передачу данных, сериализация xml предоставляет гораздо более простые решения. Вот довольно хороший обзор данных контракта serialization strategies для некоторых идей.

Конечно, вы можете реализовать суррогаты и различные методы отображения с большинством технологий сериализации. Сериализация Xml предназначена только для этих сценариев ... и, в частности, сериализация сериализации данных сумасшедшая для этих ситуаций.

Смежные вопросы