0

オブジェクトを XML としてシリアル化しようとしていますが、小さなテスターを使用して、XML としてシリアル化するときのさまざまなオブジェクトの動作を実験しています。バイナリ シリアライザーが深く、XML が浅いことはわかっています。ただし、XML を使用する場合、別のオブジェクト内で構成された List をシリアル化しようとするようです。

私の問題は、リストをシリアル化するときにコピーされたデータを取得することです。コードと出力は次のとおりです。

class Program
{
    static void Main(string[] args)
    {
        TestSerializer original = new TestSerializer();
        System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(original.GetType());
        x.Serialize(Console.Out, original);
        Console.WriteLine("\n\n\n");

        using (MemoryStream stream = new MemoryStream())
        {
            x.Serialize(stream, original);
            stream.Seek(0, SeekOrigin.Begin);

            TestSerializer copy = x.Deserialize(stream) as TestSerializer;
            x.Serialize(Console.Out, copy);
        }
        Console.ReadLine();
    }
}

public class TestSerializer
{
    public List<string> words = new List<string>();
    public TestSerializer()
    {
        words.Add("word");
        words.Add("anotherword");
    }
}

対応する出力:

<?xml version="1.0" encoding="IBM437"?>
<TestSerializer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd=
"http://www.w3.org/2001/XMLSchema">
  <words>
    <string>word</string>
    <string>anotherword</string>
  </words>
</TestSerializer>



<?xml version="1.0" encoding="IBM437"?>
<TestSerializer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd=
"http://www.w3.org/2001/XMLSchema">
  <words>
    <string>word</string>
    <string>anotherword</string>
    <string>word</string>
    <string>anotherword</string>
  </words>
</TestSerializer>

ご覧のとおり、"original" をシリアル化するとリストの内容が 2 倍になり、次に "copy" に逆シリアル化されます。これに関する限り、私が見逃しているものはありますか?重複データがあってはならないようです。

4

1 に答える 1

3

TestSerializer クラスのコンストラクターにブレークポイントを設定します。たとえば、次の行で呼び出されていることに気付くでしょう。

TestSerializer copy = x.Deserialize(stream) as TestSerializer;

したがって、オブジェクトを逆シリアル化すると、次のことが起こります

  1. TestSerializer の最初のインスタンスが作成され (リストに 2 つの値が設定されます)、既定のコンストラクターが実行されます。
  2. デシリアライゼーションにより、ストリームから作成されたオブジェクトに項目が追加されます (現在、4 つの項目があります)。
于 2012-08-26T07:17:03.600 に答える