4

私はシリアライゼーションについて読んでいて、これまでのところ BinaryFormatter と SoapFormatter をいじっています。これまでのところ、非常に良好です。すべてが完全にシリアライズされ、デシリアライズされています。

ただし、以下のコードを試すと、データファイルに名前の情報が含まれていないと予想されますが、含まれています。フィールドで SoapIgnore を指定すると、なぜそれが含まれるのでしょうか?

Age-fieldも試してみまし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

次のコードは機能します。SoapFormatter は、BinaryFormatter と同じ属性 ([NonSerialized] 属性) を使用しているようです。ただし、これは、私が読んでいる MS Press の本に記載されている内容に反します。データをシリアル化するときに SoapFormatter で機能する属性として、SoapIgnore、SoapAttribute などをリストします。

このコードは 2 つのファイルを作成しますが、いずれのファイルにも Name フィールドはありません。

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 に答える
1

ドキュメントから、属性がこのプロパティをシリアル化しないように[SoapIgnore]指示していると述べられており、それについては言及されていないため、名前が示唆していても適用されないと思いますXMLSerializerSoapFormatter

于 2010-09-03T11:40:22.173 に答える
0

この質問を見てください: Applying SoapIgnore attribute does not take any effect to serialization result

于 2010-09-03T11:38:20.477 に答える