問題タブ [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# - XmlTypeAttributeを持つ生成されたクラスにIXmlSerializableを実装する
基本的に、最初の問題は、ブール値を0または1としてシリアル化する必要があることです。私が見つけた解決策は、IXmlSerializableを実装することでした。残念ながら、私がシリアル化しようとしているクラスは、スキーマから生成されたコードであり、XmlTypeAttributeが含まれています。通常の方法で作成されたXmlSerializerを使用してオブジェクトを(逆)シリアル化しようとすると(new XmlSerializer(type)
)、次の例外がスローされます。
System.InvalidOperationException: Only XmlRoot attribute may be specified for the type ______ Please use XmlSchemaProviderAttribute to specify schema type.
2つのオプションがすぐに思い浮かびます。
1)生成されたコードの属性を削除します。この変更は、コードが再生成されるたびに行う必要があります。
2)シリアライザーを作成するときにXmlAttributeOverridesオブジェクトを使用して、属性を削除します。これには、コードベースの残りの部分がその属性をオーバーライドする必要があることを「知る」必要があります。また、スローされた例外は、それを修正するために何をする必要があるかについての手がかりをまったく与えません。
どちらのオプションもちょっと悪臭を放ちます。3番目のオプションはありますか?
.net - 特定のタイプのフィールドでカスタム Xml シリアライゼーション/デシリアライゼーションを許可する問題
私は .net で Xml シリアライゼーション/デシリアライゼーションを扱ってきましたが、シリアライゼーション/デシリアライゼーション プロセスが Xml フラグメントの特定の部分にのみ適用される方法が必要でした。これは、逆シリアル化プロセスの後、フラグメントの特定の部分を Xml に保持できるようにするためです。
これを行うには、IXmlSerializable を実装する新しいクラス (XmlLiteral) を作成し、IXmlSerializable.ReadXml および IXmlSerializable.WriteXml メソッドを処理するための特定のコードを作成するのが最善であると考えました。
以下の私の例では、これはシリアル化に対して機能しますが、逆シリアル化プロセス中に、XmlLiteral クラスの複数回の使用に対して実行に失敗します。以下の私の例では、sTest1 は正しく入力されますが、sTest2 と sTest3 は空です。
次の行で間違っているに違いないと思いますが、理由がわかりません..何かアイデアはありますか?
完全なリスト:
xml - WCF 操作で異なる戻り XML
私は国際的な HTTP 標準に合わせてサービスを作成しています。単一、複数、およびエラーと呼ばれる 3 つの異なる XML 結果を返すことができるメソッドが 1 つあります。これで、これらの各結果を使用して生成できる IXmlSerializable クラスを作成しました。ただし、WCF は、単一の戻り XML ルート名しか持てないと主張しているようです。Single、Multiple、または Errorのいずれかのカスタム オブジェクトの XmlRoot を選択する必要があります。
実行時にルートを選択できるように WCF を設定するにはどうすればよいですか?
これは私が現在持っているものです。
ItemCollection は IXmlSerializable を実装し、どの戻り値を書き込むかを選択できますが、ItemCollection クラスの XmlRoot 属性により、ルート XML ノードは常に複数になります。
c# - IXmlSerializable クラスで XML 構成ファイルを表す
私は C# で書いていて、IXmlSerializable
クラスを介して XML 構成ファイルを表現しようとしています。ただし、次のような、構成ファイルでネストされた要素を表す方法がわかりませんlogLevel
。
タグLogLevel
のすべての可能な値を表す列挙型が呼び出されます。logLevel
内のタグcredentials
はすべて文字列として出力されます。と呼ばれる私のクラスでDLLConfigFile
は、次のものがありました。
<logLevel>
ただし、 XML ファイルのルート ノード内にないため、これは機能しません<logging>
。どうすればこれを行うことができますか?
ノードに関しては、次のようなプロパティを持つ<credentials>
2 番目のクラスが必要になると思います。CredentialsSection
編集: さて、Robert Loveの提案を試して、LoggingSection
クラスを作成しました。ただし、私のテストは失敗します:
私がテストしている設定ファイルには間違いなく<logging>
. クラスは次のようになります。
ado.net - Windows Search が Authors プロパティの文字列配列を返すため、DataTable の XML を書き込めません
System.Author
Windows プロパティは、複数値の文字列です。Windows Searchは、この値を DataColumn の文字列の配列として返します。(列のデータ型はstring[]
orString()
です。)結果のデータ テーブルでメソッドを呼び出すとWriteXML
、次のInvalidOperationException
例外が発生します。
特定の列または特定のデータ型に使用するデータ テーブルの xml-serializer を指定する方法はありますか?
WriteXML
基本的に、このデータテーブルをどのように扱うことができますか?
System.InvalidOperationException: Type System.String[] は IXmlSerializable インターフェイスを実装していないため、シリアル化を続行できません。
.net - 複雑なオブジェクトグラフでIXmlSerializableインターフェイスを使用する
カスタムXMLシリアル化( )を使用する場合、カスタムインターフェイスを使用しないIXmlSerialiable
構成要素の複合オブジェクトを持つプロパティを含む複合オブジェクトで、メソッドで、デシリアライザーがそれらの子プロパティで通常の逆シリアル化を使用するように指定するにはどうすればよいですか?IXmlSerializable
IXmlSerializable.ReadXml(XmlReader reader)
注:この質問に似ています
c# - 'Key' /'Value'ノードのないC#のIXmlSerializableディクショナリ
C#で辞書をシリアル化しようとしています。私が見つけたすべての 例は、次のようなXMLを作成します。
さまざまで、ArrayOfEntries
ノードが不要な場合もありますが、辞書のキーと値のペアの規則的なパターンが独自のノードに格納されているのがわかります。私が欲しいのは次のようなものです:
私は以前にこれを作成ReadXml
しWriteXml
て実行しましたが、単一の辞書で機能しますが、シリアル化可能なList<T>
辞書インスタンスのをシリアル化および逆シリアル化しようとすると、逆シリアル化されたリストには最後のシリアル化可能な辞書のみが含まれます。いつ停止するかわからないように、読み取りまたは書き込みメソッドについて何かが貪欲でなければならないと思います。シリアル化可能な辞書のシリアル化には現在機能しない私のシリアル化可能な辞書メソッドはList
次のとおりです。
そしてReadXml
:
他のチュートリアルと私が行っていることとの違いに気付いたのは、多くの人がXmlSerializer
オブジェクトのシリアル化と逆シリアルReadXml
化に使用しているのWriteXml
に対し、私はなどを使用WriteElementString
していることです。
私の質問は、そのXMLが上記の2番目のXMLの例のようになるように辞書をシリアル化するにはどうすればよいですか?ただし、シリアル化と逆シリアル化List<MySerializableDictionary>
も機能しますか?「なぜあなたは何とかしているのか、それはそれを面白くするかもしれない」というヒントでさえ助けになるでしょう。
c# - シリアル化:クラス名を変更せずにルートノードの名前を変更します
ゴール
「Item」という名前のクラスを取得し、そのシリアル化されたXMLを次のように出力します。
問題
ルートノードは、IXmlSerializableを実装しているクラス名から派生しています。
だから私は次のようなXMLになります
質問
属性、オーバーライドできるプロパティ、または(クラス名の変更以外に)目的の効果を得るための何かがありますか?
ありがとう!
フレデリクのおかげで解決!
@Frederik Gheyselsの回答に対する私のコメントで質問が答えられているので、埋もれないようにここに置くと思いました。
クラスにXmlRoot属性を追加するだけで、ルートノードの出力xmlが変更されます。
例:
.net - IXMLSerializeable
2 つのメンバーのカスタム シリアル化のために IXMLSerializeable を実装する必要がありますが、残りのメンバーを既定のシリアル化でシリアル化する必要があります。または、少なくとも、他のメンバーで標準のシリアル化を呼び出す方法はありますか? 他のメンバーの型は非常に大きく、深く根付いたクラスであり、すべてのメンバーのシリアル化をチェーン全体で定義するのは実際的ではありません。
.net - IXmlSerializable を使用すると、base64 のサイズの膨張をどのように回避できますか?
MSDNから:
このインターフェイスを実装する理由は 2 つあります。1 つ目は、オブジェクトが XmlSerializer によってシリアル化または逆シリアル化される方法を制御することです。たとえば、大きなデータ セットをバッファリングする代わりに、データをバイトにチャンクできます。また、Base64 エンコーディングを使用してデータをエンコードするときに発生するインフレーションも回避できます。
IXmlSerializable を実装すると、base64 のサイズの膨張をどのように回避できますか?
つまり、IXmlSerializable を実装し、バイト配列を XmlWriter に書き込みたいとします。私が知る限り、それを行うための最もインフレの少ない方法はXmlWriter.WriteBase64です-データを直接書き込むことができないため-XMLでは無効なバイトが含まれます。