問題タブ [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.

0 投票する
1 に答える
42 参照

c# - null フィールドがある場合は省略して XmlSerializer で型をシリアル化する

これが私の質問を示す自己完結型のサンプル プログラムです: https://gist.github.com/jennings/46c20733df559d02b9ad

私はMaybe<T>次のようなタイプを書いています:

シリアライゼーションのこれら 2 つの目標のいずれかを達成できますか?

  1. 型のプロパティがシリアル化されている場合、 nullMaybe<T>の場合はプロパティをまったく発行しないでください(文字列プロパティにはこの動作があるようです)。_value

  2. _value の代わりに をシリアル化しMaybe<T>ます。

したがって、私の型を使用するクラスが次のようになっているとします。

次に、MaybeaString._valuenull の場合、シリアル化するときにこれが必要です。

私はこれらのどちらも望んでいません:

シリアライゼーションを設定したくありませんAnyRandomObjectUsingMyType。非常に多くのものがあるからです。Maybe<T>どこでも同じ動作が得られるように、これを制御したいのです。


いくつかのコンテキスト

この型Maybe<T>は、 のドロップイン置換を意味しTます。しかし、いくつかの場所で XML シリアライゼーションを使用しています。次のようなオブジェクトがある場合:

SomeValue が null の場合、このクラスは次のようにシリアル化されます。

クラスをこれに変更できるようにしたい:

そして、シリアル化された表現が同一であることを望みます。V1 アプリがデシリアライズすると、null 文字列が取得されます。V2 アプリがデシリアライズすると、Maybe<string>None を表す が取得されます。

私は自分のIXmlSerializable.WriteXmlメソッドでこれをやろうとしましたが、それが呼び出されると、XmlWriter はすでにこれを基礎となるストリームに書き込んでいるようです:

したがって、私のWriteXmlメソッドが呼び出されるまでには、手遅れのようです。多分これを制御する別の方法がありますか?

シリアライザーに次のように指定できれば、「タイプ のオブジェクトに遭遇したらすぐに、Maybe<T>その_valueプロパティを の代わりにシリアル化してくださいMaybe<T>」、それも私の目標を達成します。

0 投票する
1 に答える
794 参照

c# - DataContract + IxmlSerializable

Java サーバーで作成された「カスタム オブジェクトと属性」を含むプロジェクトがあり、C# クライアントでこのデータが必要です。

たとえば、カスタムオブジェクト「A」には属性「B」、「C」があります。'B' と 'C' の両方が実行時に顧客によって記述されます。サーバーはこれを次のような XML で送信します。

カスタム属性をディクショナリに入力するサーバーの xml を読み書きするIXmlSerializableを実装するクラスを作成しました。

プロジェクトは遅いので、より高速な DataContract Serialization を使用したいと考えています。属性 (「B」、「C」など) にハードコードされた [DataContract] を明示的に指定して、サンプルでテストしました。ただし、私たちのユースケースでは、属性はコンパイル時にわかりません。タイプ「A」の属性のリストをサーバーに照会できます。

実行時に定義された属性に DataContract を使用するにはどうすればよいですか

0 投票する
1 に答える
3528 参照

c# - C# XML シリアライゼーション オーバーライド IXmlSerializable クラスの型

最初の質問

クラスのXmlTypeを動的serializeList<IXmlSerializable>変更したい(属性タグを使用してそれを行うことはできません)IXmlSerializable

XmlAttributeOverridesを使用してそれを実行しようとしましたが、これまでのところ成功していません。

この問題を示すサンプル コードを次に示します。
IXmlSerializable クラス ( MSDNから) :

テストクラス (出力にコンソールを使用):

これが私が取得したいものです:

しかし、実行時にこのエラーが発生します:

System.InvalidOperationException: タイプ Person には XmlRoot 属性のみを指定できます。XmlSchemaProviderAttribute を使用してスキーマ タイプを指定してください。

私のPerson クラスが を実装していない場合IXmlSerializable、すべてがうまく機能します...

誰かが私を助けてくれますか?


選択したソリューション ( @dbc answerに基づく)

@dbcが指摘したように、「サロゲート」クラスを使用することは、私が望むことを行う最も簡単な方法です。しかし、既に述べたように、Person 型を動的に変更する必要があるため、属性タグを使用できません。
だから私はまだXmlAttributeOverrides私の最終的なデザインで使用しています、ここにあります:

サロゲートList<Person>クラス(属性タグなしの @dbc と同じ) :

surrogate を使用してクラスをテストします。

@dbc に大いに感謝してこれを締めくくりたいと思います。あなたの答えは非常に役に立ち、有益でした。多くのことを学びました。私はあなたに賛成票を投じることはできませんが、コミュニティがそうしてくれることを願っています!

0 投票する
1 に答える
215 参照

c# - 内部タグを書き込もうとすると、IXmlSerializable.WriteXml 中に例外が発生する

テストクラスは次のとおりです。

WriteXml を呼び出すと、例外がスローされます。

インターネット上の例では、このコードは問題を引き起こしません (例: http://www.codeproject.com/Articles/43237/How-to-Implement-IXmlSerializable-Correctly ) が、私にとっては機能しません。その理由は何ですか?

更新: 最終的に、クラスを次のようにシリアル化したいと思います。

0 投票する
1 に答える
973 参照

c# - XmlSerializer が System.InvalidOperationException をスローする

だから基本的に私は2つのクラスを持っています:

このコードはうまく機能します:

シリアル化結果:

ただし、このコードは例外をスローします: System.Xml.dll で「System.InvalidOperationException」型の未処理の例外が発生しました追加情報: XML ドキュメントにエラーがあります (4、6)。

したがって、セクションのシリアル化では、属性ベースのシリアル化を使用できませんが、完全に正常に機能します。

UPD1 : ルートとしてのセクションのシリアル化/逆シリアル化はうまく機能します

0 投票する
2 に答える
51 参照

c# - object 属性で CustomClass の List をシリアル化する方法

CMainClass をシリアル化したい:

属性 Value のタイプはさまざまであるため、object-type が使用されます。

ここにテストコードがあります

私が望むのは、次の形式で出力を取得することだけです

それ以外の

出来ますか?Value のプロパティを [XmlElement] から [XmlAttribute] に変更するとエラーになります。