1

以下の結果が得られる理由を誰か説明できますか?

インスタンス化する必要があるクラス:

[System.SerializableAttribute()]
public class SampleClass
{
    [System.Xml.Serialization.XmlElementAttribute(Order = 10)]
    public string Foo { get; set; }
    [System.Xml.Serialization.XmlElementAttribute(Order = 5)]
    public string Bar { get; set; }
}

逆シリアル化に使用される XML:

<?xml version="1.0" encoding="utf-8" ?>
<SampleClass>
  <Foo>Test1</Foo>
  <Bar>Test2</Bar>
</SampleClass>

逆シリアル化されたクラスで Foo = Test1 (正しい) と Bar = null (正しくない) が表示されます。

これはすべてOrder属性に関するものです。意図的に間違った値に設定されています。値が 0 と 1 の場合、すべて正常に動作します。

Name条件は両方のフィールドで一致しOrderませんが、何らかの理由で一方のフィールドが逆シリアル化され、もう一方のフィールドは逆シリアル化されません。Exceptionむしろ、両方の値が null であるか、両方のフィールドが解決されてシリアル化解除されていることを期待したいと思います。

それについての説明はありますか?

4

1 に答える 1

4

実際にはシリアル化エラーが表示されます。

それは本当にデザインの好みに帰着します。except開発者は、逆シリアル化プロセス全体を中止したくはなく、通知して続行することを決定しました。

XMLを使用します。

<?xml version="1.0" encoding="utf-8" ?>
<SampleClass>
  <Foo>Test1</Foo>
  <Bar>Test2</Bar>
</SampleClass>

このコードをデシリアライズすることを検討してください。

XmlSerializer xs = new XmlSerializer(typeof(SampleClass));

XmlDeserializationEvents events = new XmlDeserializationEvents();
events.OnUnknownAttribute = (sender, e) => Debug.WriteLine("Unknown Attributed");
events.OnUnknownElement = (sender, e) => Debug.WriteLine("Unknwon Element");
events.OnUnknownNode = (sender, e) => Debug.WriteLine("Unknown Node");
events.OnUnreferencedObject = (sender, e) => Debug.WriteLine("Unreferenced Object");

SampleClass cs_de = (SampleClass)xs.Deserialize(XmlReader.Create(new StringReader(xml)), events);

Debug.WriteLine(cs_de.Foo);
Debug.WriteLine(cs_de.Bar);

正しい順序を使用する場合。

[System.Xml.Serialization.XmlElementAttribute(Order = 0)]
public string Foo { get; set; }
[System.Xml.Serialization.XmlElementAttribute(Order = 1)]
public string Bar { get; set; }

私の出力は

Foo
Bar

間違った順序を使用した場合。

[System.Xml.Serialization.XmlElementAttribute(Order = 10)]
public string Foo { get; set; }
[System.Xml.Serialization.XmlElementAttribute(Order = 5)]
public string Bar { get; set; }

私の出力は

Unknown Node
Unknwon Element
Foo

では、なぜFoo印刷するのですか?私の理解では、それはインデックスでOrderはありません。Orderingは、前に表示する必要があることを指定するだけでありFooBar10Foo番目の要素であるBar必要はなく、5番目である必要があります。これにより、デシリアライザーがより柔軟になると思います。

于 2012-10-24T18:48:33.987 に答える