問題タブ [ixmlserializable]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - null フィールドがある場合は省略して XmlSerializer で型をシリアル化する
これが私の質問を示す自己完結型のサンプル プログラムです: https://gist.github.com/jennings/46c20733df559d02b9ad
私はMaybe<T>
次のようなタイプを書いています:
シリアライゼーションのこれら 2 つの目標のいずれかを達成できますか?
型のプロパティがシリアル化されている場合、 null
Maybe<T>
の場合はプロパティをまったく発行しないでください(文字列プロパティにはこの動作があるようです)。_value
_value
の代わりに をシリアル化しMaybe<T>
ます。
したがって、私の型を使用するクラスが次のようになっているとします。
次に、MaybeaString._value
null の場合、シリアル化するときにこれが必要です。
私はこれらのどちらも望んでいません:
シリアライゼーションを設定したくありませんAnyRandomObjectUsingMyType
。非常に多くのものがあるからです。Maybe<T>
どこでも同じ動作が得られるように、これを制御したいのです。
いくつかのコンテキスト
この型Maybe<T>
は、 のドロップイン置換を意味しT
ます。しかし、いくつかの場所で XML シリアライゼーションを使用しています。次のようなオブジェクトがある場合:
SomeValue が null の場合、このクラスは次のようにシリアル化されます。
クラスをこれに変更できるようにしたい:
そして、シリアル化された表現が同一であることを望みます。V1 アプリがデシリアライズすると、null 文字列が取得されます。V2 アプリがデシリアライズすると、Maybe<string>
None を表す が取得されます。
私は自分のIXmlSerializable.WriteXml
メソッドでこれをやろうとしましたが、それが呼び出されると、XmlWriter はすでにこれを基礎となるストリームに書き込んでいるようです:
したがって、私のWriteXml
メソッドが呼び出されるまでには、手遅れのようです。多分これを制御する別の方法がありますか?
シリアライザーに次のように指定できれば、「タイプ のオブジェクトに遭遇したらすぐに、Maybe<T>
その_value
プロパティを の代わりにシリアル化してくださいMaybe<T>
」、それも私の目標を達成します。
c# - DataContract + IxmlSerializable
Java サーバーで作成された「カスタム オブジェクトと属性」を含むプロジェクトがあり、C# クライアントでこのデータが必要です。
たとえば、カスタムオブジェクト「A」には属性「B」、「C」があります。'B' と 'C' の両方が実行時に顧客によって記述されます。サーバーはこれを次のような XML で送信します。
カスタム属性をディクショナリに入力するサーバーの xml を読み書きするIXmlSerializableを実装するクラスを作成しました。
プロジェクトは遅いので、より高速な DataContract Serialization を使用したいと考えています。属性 (「B」、「C」など) にハードコードされた [DataContract] を明示的に指定して、サンプルでテストしました。ただし、私たちのユースケースでは、属性はコンパイル時にわかりません。タイプ「A」の属性のリストをサーバーに照会できます。
実行時に定義された属性に DataContract を使用するにはどうすればよいですか
c# - C# XML シリアライゼーション オーバーライド IXmlSerializable クラスの型
最初の質問
クラスのXmlTypeを動的serialize
にList<IXmlSerializable>
変更したい(属性タグを使用してそれを行うことはできません)IXmlSerializable
XmlAttributeOverridesを使用してそれを実行しようとしましたが、これまでのところ成功していません。
この問題を示すサンプル コードを次に示します。
IXmlSerializable クラス ( MSDNから) :
テストクラス (出力にコンソールを使用):
これが私が取得したいものです:
しかし、実行時にこのエラーが発生します:
System.InvalidOperationException: タイプ Person には XmlRoot 属性のみを指定できます。XmlSchemaProviderAttribute を使用してスキーマ タイプを指定してください。
私のPerson クラスが を実装していない場合IXmlSerializable
、すべてがうまく機能します...
誰かが私を助けてくれますか?
選択したソリューション ( @dbc answerに基づく)
@dbcが指摘したように、「サロゲート」クラスを使用することは、私が望むことを行う最も簡単な方法です。しかし、既に述べたように、Person 型を動的に変更する必要があるため、属性タグを使用できません。
だから私はまだXmlAttributeOverrides
私の最終的なデザインで使用しています、ここにあります:
サロゲートList<Person>
クラス(属性タグなしの @dbc と同じ) :
surrogate を使用してクラスをテストします。
@dbc に大いに感謝してこれを締めくくりたいと思います。あなたの答えは非常に役に立ち、有益でした。多くのことを学びました。私はあなたに賛成票を投じることはできませんが、コミュニティがそうしてくれることを願っています!
c# - 内部タグを書き込もうとすると、IXmlSerializable.WriteXml 中に例外が発生する
テストクラスは次のとおりです。
WriteXml を呼び出すと、例外がスローされます。
インターネット上の例では、このコードは問題を引き起こしません (例: http://www.codeproject.com/Articles/43237/How-to-Implement-IXmlSerializable-Correctly ) が、私にとっては機能しません。その理由は何ですか?
更新: 最終的に、クラスを次のようにシリアル化したいと思います。
c# - XmlSerializer が System.InvalidOperationException をスローする
だから基本的に私は2つのクラスを持っています:
このコードはうまく機能します:
シリアル化結果:
ただし、このコードは例外をスローします: System.Xml.dll で「System.InvalidOperationException」型の未処理の例外が発生しました追加情報: XML ドキュメントにエラーがあります (4、6)。
したがって、セクションのシリアル化では、属性ベースのシリアル化を使用できませんが、完全に正常に機能します。
UPD1 : ルートとしてのセクションのシリアル化/逆シリアル化はうまく機能します
c# - object 属性で CustomClass の List をシリアル化する方法
CMainClass をシリアル化したい:
属性 Value のタイプはさまざまであるため、object-type が使用されます。
ここにテストコードがあります
私が望むのは、次の形式で出力を取得することだけです
それ以外の
出来ますか?Value のプロパティを [XmlElement] から [XmlAttribute] に変更するとエラーになります。