Ошибки сериализации в .NET? - PullRequest
4 голосов
/ 03 сентября 2010

Я читаю о сериализации, и до сих пор возился с BinaryFormatter и SoapFormatter. Пока все хорошо - и все отлично сериализовано и десериализовано.

Однако, когда я попробую приведенный ниже код, я ожидаю, что мой файл данных НЕ будет содержать информацию для имени - и это так. Зачем это содержать, когда я указываю SoapIgnore на поле?

Я также пробовал с SoapAttribute("SomeAttribute") на поле возраста, и это тоже не имело никакого значения. Версия фреймворка установлена ​​на 2.0, но то же самое происходит в 3.5 и 4.0.

using System;
using System.Runtime.Serialization.Formatters.Soap;
using System.IO;
using System.Xml.Serialization;

class Program
{
    static void Main(string[] args)
    {
        Person p = new Person();
        p.Age = 42;
        p.Name = "Mr Smith";

        SoapFormatter formatter = new SoapFormatter();
        FileStream fs = new FileStream(@"c:\test\data.txt", FileMode.Create);

        formatter.Serialize(fs, p);
    }
}

[Serializable]
class Person
{
    public int Age;
    [SoapIgnore]
    public string Name;
}

Ответы [ 5 ]

9 голосов
/ 03 сентября 2010

Используйте [NonSerialized] вместо [SoapIgnore]

Кроме того, это более старый (и устаревший) API.Не совсем неправильно, но обязательно прочитайте XmlSerialization и ProtoBuf .

И будьте осторожны, чтобы не перепутать API.Сериализация - это часть связи SOAP, но не одно и то же.Атрибут Soap не участвует в простой сериализации.

1 голос
/ 03 сентября 2010

Следующий код работает. Похоже, что SoapFormatter использует те же атрибуты, что и BinaryFormatter - атрибут [NonSerialized]. Это, однако, идет вразрез с тем, что говорится в книге MS Press, которую я читаю. В нем перечислены SoapIgnore, SoapAttribute и другие в качестве атрибутов, которые работают с SoapFormatter при сериализации данных.

Этот код создает два файла, ни один из которых не имеет поля имени.

using System;
using System.Runtime.Serialization.Formatters.Soap;
using System.IO;
using System.Xml.Serialization;

class Program
{
    static void Main(string[] args)
    {
        Person p = new Person();
        p.Age = 42;
        p.Name = "Mr Smith";

        FormatSoap(p);
        FormatXml(p);
    }

    private static void FormatXml(Person p)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(Person));
        FileStream fs = new FileStream(@"c:\test\xmldata.txt", FileMode.Create);

        serializer.Serialize(fs, p);
    }

    private static void FormatSoap(Person p)
    {
        SoapFormatter formatter = new SoapFormatter();
        FileStream fs = new FileStream(@"c:\test\soapdata.txt", FileMode.Create);

        formatter.Serialize(fs, p);
    }
}

[Serializable]
public class Person
{
    public int Age;
    [XmlIgnore]
    [NonSerialized]
    public string Name;
}
1 голос
/ 03 сентября 2010

Из документов говорится, что атрибут [SoapIgnore] указывает XMLSerializer не сериализовать это свойство, и не упоминает SoapFormatter, поэтому я предполагаю, что он не применяется к это, хотя название предполагает, что это делает

1 голос
/ 03 сентября 2010

Потому что сериализация и SOAP не совпадают. Name помечен как открытый, поэтому сериализатор его сериализует / десериализует. Если вы не хотите, чтобы он появлялся в сериализации, вам следует изменить уровень защиты на защищенный.

0 голосов
/ 03 сентября 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...