.NET中的序列化错误?

时间:2010-09-03 11:30:44

标签: c# .net serialization soap-serialization

我正在阅读序列化,到目前为止一直在搞乱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;
}

5 个答案:

答案 0 :(得分:9)

使用[NonSerialized]代替[SoapIgnore]

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

小心不要混淆API。序列化是SOAP通信的一部分,但不一样。 SoapAttribute不参与裸序列化。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

docs它声明[SoapIgnore]属性告诉XMLSerializer不要序列化此属性,并且它没有提到SoapFormatter所以我认为它没有不适用它,即使名字暗示它确实

答案 3 :(得分: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;
}

答案 4 :(得分:0)