4

我正在阅读序列化,到目前为止一直在搞乱 BinaryFormatter 和 SoapFormatter。到目前为止,一切都很好 - 一切都完美地序列化和反序列化。

但是,当我尝试下面的代码时,我希望我的数据文件不包含 Name 的信息 - 它确实包含。当我在该字段上指定 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;
}
4

5 回答 5

9

使用[NonSerialized]代替[SoapIgnore]

此外,这是一个较旧(且老化)的 API。没有直接错误,但请务必阅读XmlSerializationProtoBuf

并注意不要混淆 API。序列化是 SOAP 通信的一部分,但并不相同。SoapAttribute 不涉及裸序列化。

于 2010-09-03T11:37:26.873 回答
1

文档中它指出该[SoapIgnore]属性告诉XMLSerializer不要序列化此属性,并且它没有提到,SoapFormatter所以我认为它不适用于它,即使名称表明它确实如此

于 2010-09-03T11:40:22.173 回答
1

以下代码有效。似乎 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;
}
于 2010-09-03T12:00:37.580 回答
1

因为序列化和 SOAP 不一样。您已Name标记为公开,因此序列化程序将对其进行序列化/反序列化。如果您不希望它出现在序列化中,您应该将其保护级别更改为受保护。

于 2010-09-03T11:36:22.350 回答
0

看看这个问题:Applying SoapIgnore attribute doesn't take any effect to serialization result

于 2010-09-03T11:38:20.477 回答