Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > XmlSerializer или SoapFormatter ?


Автор: cosamia 25.12.2005, 22:37
Что -то неуловил разницу. Если делаю бинари сериализацию использую BinaryFormatter, если делаю xml сериализацию использую SoapFormatter.
Но зачем нужен XmlSerializer, ведь как я понимаю он выполняет ту же функцию что и SoapFormatter.
например:
XmlSerializer xsrz = new XmlSerializer();
FileStream fs = new FileStream("data.xml", FileMode.Open);
xsrz.Serialize(fs, class1);

Так зачем же тогда нужен XmlSerializer если прекрасно можно обойтись SoapFormatter:
FileStream fs = new FileStream("data.xml", FileMode.Create);
SoapFormatter formatter= new SoapFormatter();
formatter.Serialize(fs, class1);

Автор: mr.DUDA 26.12.2005, 09:20
Дело в том, что SoapFormatter выдаёт результат в специальном формате, используемом в протоколе SOAP, а XmlSerializer - в более упрощённом формате. Результаты получаются совершенно разные:
Код
using System;
using System.IO;
using System.Xml.Serialization;
using System.Runtime.Serialization.Formatters.Soap;

[Serializable]
public class MyClass
{
    public string A;
    public int B;
    public MyInnerClass C;
    public MyClass() { }
}

[Serializable]
public class MyInnerClass
{
    public float D;
    public MyInnerClass() { }
}

class Test
{
    public static void Main()
    {
        MyClass obj = new MyClass();
        obj.A = "AAA";
        obj.B = 123;
        obj.C = new MyInnerClass();
        obj.C.D = 456f;

        FileStream fs1 = File.Create("c:\\1.xml");
        SoapFormatter sf = new SoapFormatter();
        sf.Serialize(fs1, obj);

        FileStream fs2 = File.Create("c:\\2.xml");
        XmlSerializer xs = new XmlSerializer(typeof(MyClass));
        xs.Serialize(fs2, obj);
    }

}


Содержимое 1.xml (SOAP):
Код
<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:clr="http://schemas.microsoft.com/soap/encoding/clr/1.0" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<a1:MyClass id="ref-1" xmlns:a1="http://schemas.microsoft.com/clr/assem/ConsoleApplication1%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull">
<A id="ref-3">AAA</A>
<B>123</B>
<C href="#ref-4"/>
</a1:MyClass>
<a1:MyInnerClass id="ref-4" xmlns:a1="http://schemas.microsoft.com/clr/assem/ConsoleApplication1%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull">
<D>456</D>
</a1:MyInnerClass>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>


Содержимое 2.xml (XmlSerializer):
Код
<?xml version="1.0"?>
<MyClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <A>AAA</A>
  <B>123</B>
  <C>
    <D>456</D>
  </C>
</MyClass>

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)