内部オブジェクトの奇妙なバグのためのXMLシリアライザー

シルヴァンB。

いくつかの「単純な」部分とより「複雑な」部分を含む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();
        }
    }
}
シルヴァンB。

私はここで同様の質問この問題への答えを見つけることができました

ポイントは、ReadXml(XmlReader reader)メソッドをで終了することです

            reader.Read();

なぜそれが機能するのか正確にはわかりませんが、この行により、読者はカスタムメソッドの終了後もXMLドキュメントの読み取りを続行できます...

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

JSONシリアライザーを使用したMongoDBオブジェクトIDの逆シリアル化

分類Dev

Vavrオブジェクトのシリアライザー/デシリアライザー

分類Dev

深くネストされたオブジェクト用のカスタムJsonシリアライザー

分類Dev

Django RestFrameworkのネストされたシリアライザーオブジェクトがnull

分類Dev

3ディープシリアライザーを使用したオブジェクトの作成

分類Dev

ユーザー定義オブジェクトのポインタのメモリ管理のための安全なラッパークラスの記述

分類Dev

外部キーフィールドでオブジェクトを取得するためのシリアライザーとビュー

分類Dev

外部キーフィールドでオブジェクトを取得するためのシリアライザーとビュー

分類Dev

jacksonを使用したオブジェクト配列のカスタムシリアライザー

分類Dev

トランザクション(TypeORM)で複数のオブジェクトを保存するために、エンティティリポジトリのグローバルインスタンスを使用しても安全ですか?

分類Dev

TypeError: 'int'オブジェクトは反復可能なシリアライザーではありません1対多のDjangoシリアライザー

分類Dev

POST / PUT中のIDまたは埋め込まれたオブジェクト全体としてのすべてのオブジェクトに対する単一のカスタムデシリアライザー

分類Dev

POST / PUT中のIDまたは埋め込まれたオブジェクト全体としてのすべてのオブジェクトに対する単一のカスタムデシリアライザー

分類Dev

POST / PUT中のIDまたは埋め込まれたオブジェクト全体としてのすべてのオブジェクトに対する単一のカスタムデシリアライザー

分類Dev

ジャクソン(カスタムデシリアライザなし)単一値の値オブジェクトをデシリアライズするための一般的な方法はあります

分類Dev

JMSシリアライザー:オブジェクトグラフのシリアル化の深さを制限する方法

分類Dev

JMSシリアライザーはオブジェクトのArrayCollectionを逆シリアル化します

分類Dev

Sparkのシリアル化エラーを回避するためのシリアル化不可能なオブジェクトの分離

分類Dev

なぜ春データのPageオブジェクトのための私のカスタムのJSONシリアライザが呼び出されていません

分類Dev

名前空間を使用したオブジェクトの逆シリアル化でXMLシリアライザーがnullを返すのはなぜですか?

分類Dev

Djangoのネストされたオブジェクト、異なるシリアライザーGETおよびPOST

分類Dev

アクティブなモデルのシリアライザーはjsonが別のjsonオブジェクト内で動作しない

分類Dev

同じビュー内で異なるオブジェクトを構造化およびレンダリングするためのアドバイス

分類Dev

アプリでクラスオブジェクトを表示するためのC ++コードアナライザー

分類Dev

Django Rest Framework-シリアライザーのcreateメソッドでpkidまたは完全なオブジェクトを許可できますか?

分類Dev

オブジェクトをフィルタリングするためのデザインパターン

分類Dev

ActiveModelSerializers の Child シリアライザーで Parent オブジェクトにアクセスする

分類Dev

ZeroBraneの分析:ライブラリオブジェクトの「不明なグローバル変数」

分類Dev

オブジェクトがアラートダイアログの範囲外であるため、Nullpointer?

Related 関連記事

  1. 1

    JSONシリアライザーを使用したMongoDBオブジェクトIDの逆シリアル化

  2. 2

    Vavrオブジェクトのシリアライザー/デシリアライザー

  3. 3

    深くネストされたオブジェクト用のカスタムJsonシリアライザー

  4. 4

    Django RestFrameworkのネストされたシリアライザーオブジェクトがnull

  5. 5

    3ディープシリアライザーを使用したオブジェクトの作成

  6. 6

    ユーザー定義オブジェクトのポインタのメモリ管理のための安全なラッパークラスの記述

  7. 7

    外部キーフィールドでオブジェクトを取得するためのシリアライザーとビュー

  8. 8

    外部キーフィールドでオブジェクトを取得するためのシリアライザーとビュー

  9. 9

    jacksonを使用したオブジェクト配列のカスタムシリアライザー

  10. 10

    トランザクション(TypeORM)で複数のオブジェクトを保存するために、エンティティリポジトリのグローバルインスタンスを使用しても安全ですか?

  11. 11

    TypeError: 'int'オブジェクトは反復可能なシリアライザーではありません1対多のDjangoシリアライザー

  12. 12

    POST / PUT中のIDまたは埋め込まれたオブジェクト全体としてのすべてのオブジェクトに対する単一のカスタムデシリアライザー

  13. 13

    POST / PUT中のIDまたは埋め込まれたオブジェクト全体としてのすべてのオブジェクトに対する単一のカスタムデシリアライザー

  14. 14

    POST / PUT中のIDまたは埋め込まれたオブジェクト全体としてのすべてのオブジェクトに対する単一のカスタムデシリアライザー

  15. 15

    ジャクソン(カスタムデシリアライザなし)単一値の値オブジェクトをデシリアライズするための一般的な方法はあります

  16. 16

    JMSシリアライザー:オブジェクトグラフのシリアル化の深さを制限する方法

  17. 17

    JMSシリアライザーはオブジェクトのArrayCollectionを逆シリアル化します

  18. 18

    Sparkのシリアル化エラーを回避するためのシリアル化不可能なオブジェクトの分離

  19. 19

    なぜ春データのPageオブジェクトのための私のカスタムのJSONシリアライザが呼び出されていません

  20. 20

    名前空間を使用したオブジェクトの逆シリアル化でXMLシリアライザーがnullを返すのはなぜですか?

  21. 21

    Djangoのネストされたオブジェクト、異なるシリアライザーGETおよびPOST

  22. 22

    アクティブなモデルのシリアライザーはjsonが別のjsonオブジェクト内で動作しない

  23. 23

    同じビュー内で異なるオブジェクトを構造化およびレンダリングするためのアドバイス

  24. 24

    アプリでクラスオブジェクトを表示するためのC ++コードアナライザー

  25. 25

    Django Rest Framework-シリアライザーのcreateメソッドでpkidまたは完全なオブジェクトを許可できますか?

  26. 26

    オブジェクトをフィルタリングするためのデザインパターン

  27. 27

    ActiveModelSerializers の Child シリアライザーで Parent オブジェクトにアクセスする

  28. 28

    ZeroBraneの分析:ライブラリオブジェクトの「不明なグローバル変数」

  29. 29

    オブジェクトがアラートダイアログの範囲外であるため、Nullpointer?

ホットタグ

アーカイブ