いくつかの「単純な」部分とより「複雑な」部分を含むXSDスキーマがあります(フレームワーク属性を使用して適切な方法でシリアル化することはできません)。単純な部分には.Netシリアライザーを使用IXmlSerializable
し、内部オブジェクトにインターフェイスを実装することで、より複雑な部分にはカスタムシリアライザーを作成しました。
コードをテストすると、逆シリアル化された「カスタム」部分のみが出力されます(読み取り時)。「root」クラスの複雑なオブジェクトを参照するプロパティにコメントすると、すべての単純なシリアル化が発生します(読み取りと書き込み)。必要に応じて内部オブジェクトのみをシリアル化するのではなく、手作りのシリアライザーがシリアル化をすべて制御することを意味します。私にとってこれは奇妙な振る舞いですが、バグはどこにありますか?
IXmlSerializableを内部オブジェクトでのみ使用することは可能ですか?
これは「ルート」クラスです:
public class RootElement
{
[XmlAttribute("foo")]
public Foo foo;
[XmlAttribute("bar")]
public Bar? bar;
public bool ShouldSerializeBar()
{
return bar.ShouldSerialize;
}
[XmlElement("SimpleXml")]
public SimpleXml simpleXml;
// commenting these two lines radically change the serialization
[XmlElement("ComplexXmlWithCustomSerializer")]
public ComplexXml complexXml;
}
これが「ComplexXml」クラスです
public class ComplexXml : IXmlSerializable
{
public double pty1;
public double? pty2;
public System.Xml.Schema.XmlSchema GetSchema()
{
return null;
}
public void ReadXml(XmlReader reader)
{
XmlReader reader2 = reader.ReadSubtree();
while (reader2.Read())
{
if (reader2.NodeType == XmlNodeType.Element)
{
string unit;
switch (reader2.Name)
{
case "Pty1":
unit = reader2.GetAttribute("unit");
if (string.Equals(unit, "mm"))
pty1 = double.Parse(reader2.GetAttribute("value"));
break;
case "Pty2":
unit = reader2.GetAttribute("unit");
if (string.Equals(unit, "deg"))
pty2 = double.Parse(reader2.GetAttribute("value"));
break;
}
}
if (reader2.NodeType == XmlNodeType.EndElement)
reader2.ReadEndElement();
}
}
public void WriteXml(XmlWriter writer)
{
//pty1
writer.WriteStartElement("Pty1");
writer.WriteAttributeString("unit", "mm");
writer.WriteAttributeString("value", pty1.ToString());
writer.WriteEndElement();
//pty2
if (pty2.HasValue)
{
writer.WriteStartElement("Pty2");
writer.WriteAttributeString("unit", "deg");
writer.WriteAttributeString("value", WrapAngle.Value.ToString());
writer.WriteEndElement();
}
}
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加