問題タブ [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.
.net - IXmlSerializable を使用したデータ コントラクト型の WSDL/XSD スキーマのエクスポート
Java アプリから使用したい WCF サービスを作成しています。しかし、問題は .net-java 相互運用性に関するものではありません。
ポイントは、サービス操作に関係する型の1つがIXmlSerializableであることです。その型は、XmlSchemaProviderAttribute によって参照される静的メソッドを使用して XSD スキーマを返します。問題は、mex-endpoint ( http://..svc?wsdl ) を介してサービスの wsdl を取得すると、そのスキーマが返されないことです。
詳細はこちら。
一部の wcf サービス コントラクト:
DomainData タイプは次のとおりです。
ご覧のとおり、DomainData には AuxDomainData オブジェクトのディクショナリが含まれています。
ここでは、GetXmlSerializationSchema メソッドで XSD スキーマを返しています。スキーマ自体は簡単ですが、ここでは割愛させてください。
そのコードは簡単だと思いますが、これは IXmlSerializable 型の一般的なシナリオです。
ここで、WSDL が必要です。Metroの助けを借りて WSDL を使用して Java クライアントを作成しますが 、実際には JDK 1.6 で十分です。WS スタック (および wsimport.exe) が含まれているからです。したがって、Java は wsdl:service 定義で wsdl を必要とします。そのため、wsdl.exe から wsdl を渡すことができません (wsdl によって生成された wsdl には wsdl:service 定義が含まれておらず、wsdl:portType のみが含まれているため)。そこで、wsimport.bat http://localhost/Service1.svc?wsdlを呼び出します。
しかし、私がレスポーズで得たものは次のとおりです。
これは、構成された wsdl には実際には AuxDomainData などの型が含まれていないためです。それは真実であり、java/metro/その他のスタックを非難することはできません。wcf によって生成された wsdl を見ると、すべての xsd スキーマをインポートする wsdl:types 要素が含まれています。
ここですべての xsd を提供することはしませんが、要点はそれらに AuxDomainData 定義がないことです。AuxDomainData タイプの xsd-schema はhttp://localhost/CustomSerialization/Service1.svc?xsd=xsd 4 "document" にあります。しかし、ご覧のとおり、ルート wsdl にはそれへの参照が含まれていません。それが問題です。結果の wsdl/xsd スキーマ セットは完全ではありません。
それで、私のオプションは何ですか?
c# - XmlSerializerを使用したカスタムシリアル化
カスタムXML出力を実行する必要があるクラスがあるため、IXmlSerializableインターフェイスを実装します。ただし、xmlタグ名を変更する場合を除いて、デフォルトのシリアル化で出力するフィールドがいくつかあります。serializer.Serializeを呼び出すと、XMLでデフォルトのタグ名を取得します。どういうわけかこれらを変更できますか?
これが私のコードです:
これが私のXml出力です:
最終的には次のようになります。
c# - 基本クラスでIXmlSerializableを実装するときに「デフォルト」のXMLシリアル化に戻す方法は?
IXmlSerializable を実装する基本クラスから継承するクラスをシリアル化しようとしています。
PropertyBag と呼ばれる基本クラスは、動的プロパティを許可するクラスです ( Marc Gravell の功績によるものです)。
IXmlSerializable を実装して、動的プロパティ (Dictionary に格納されている) が通常の xml 要素として記述されるようにしました。
たとえば、クラス Person をパブリック プロパティ (非動的) Name と動的プロパティ Age でシリアル化する場合、次の XML を生成したいと考えています。
基本 PropertyBag クラスの WriteXml の次の実装で動作するパーツを取得できます。
ただし、Person クラスをシリアル化する場合、Person の WriteXml メソッドを上書きしない限り、通常の (動的ではない) プロパティはシリアル化されなくなります (これはやりたくありません)。基本クラスで静的プロパティを自動的に追加できる方法はありますか? リフレクションを使用して手動でこれを行うことができることは知っていますが、.Net Framework に組み込み機能があるかどうか疑問に思っていましたか?
c# - IXmlSerializableでの参照の検索
IXmlSerializableを使用して、特定のタイプの要素を送信xmlに書き込んでいます。スキーマを実装し、項目を書き出しています。次のコードは例です。
私が抱えている問題は、MyTypeが参照を使用するものとして宣言されていることです
したがって、アイテムがすでにxmlに書き込まれている場合は、参照である必要があります。
参照がすでにxmlに書き込まれているかどうかを確認するにはどうすればよいですか?私は、私が明示的に管理していない参照を無視しなければならないと考えています。そうすれば、自分の参照IDを作成し、自分のインスタンスを参照します。
複製してはならない参照を複製しているので、これは明らかに悪いハッキングされた妥協案です。
すでにシリアル化されているアイテムのIDを見つけることができるかどうかを確認するために、すでに書き込まれているものを見つける方法はありますか?
よろしく
クレイグ。
c# - ネストされた/子オブジェクトのカスタム XmlSerialization
他の 2 つのクラスがネストされているクラス Resource があるシナリオがあります。アクションと ResourceURL。リソースとアクション用のカスタム xmlserializer を作成する必要がありますが、ResourceURL 用ではありません。両方に IXmlSerializable を実装しました。
問題は、リソースがシリアル化されているときに、Action.WriteXML(XmlWriter) を呼び出してシリアル化された形式のアクションを取得することですが、シリアル化された形式の ResourceURL を取得できないことです。タグがめちゃくちゃになり、タグも追加されます。
では、ネストされたオブジェクトの中には顧客シリアル化があるオブジェクトをシリアル化するにはどうすればよいですか?
c# - CDATAタグの有無にかかわらずデータを含むコンテンツにIXmlSerializableを実装する
一部の入力に対してコンテンツがCDATAタグとともに渡されるxmlタグを解析する方法を見つけようとしていますが、すべてではありません。
たとえば、以下は、CDATAタグを含むデータに対して受け取るサンプルコンテンツです。ただし、CDATAタグが省略されるシナリオは他にもいくつかあります。
どういうわけかそれを検出し、両方のタイプの入力(CDATAの有無にかかわらず)を解析できるReadXmlメソッドを実装するための洗練された方法はありますか?これまでのところ、ReadXml()の実装は次のとおりですが、CDATAタグを省略すると解析中にエラーが発生します。
serialization - シリアル化を拒否するオブジェクトが含まれている場合、データテーブルを保存するにはどうすればよいですか?
Google APIのGData「イベント」オブジェクトをデータブルに保存しています(オブジェクトとしてキャストする必要がありました。そうしないと、イベントにアクセスできませんでした)。イベントのすべてのプロパティに完全にアクセスして、 Googleを更新するためにそれらを使用しますが、次の理由により、データテーブル(または親データセット)をファイルにシリアル化できません。
タイプ「Google.GData.Calendar.EventEntry、Google.GData.Calendar、Version = 1.4.0.2、Culture = neutral、PublicKeyToken = aa6748391206b888」はIXmlSerializableインターフェースを実装していないため、シリアル化を続行できません。
これは、単純にXMLまたはバイナリとしてシリアル化しようとしても発生しますが、問題を回避する方法を見つけることができません。何らかの方法でデータ構造をファイルに保存することはできませんか?
コンテキストを設定するために、私は元々GData EventFeedをXMLとして保存していましたが、Google APIのmyEventFeed.saveToXMLを使用して理解するのに約30秒かかり、後でリロードするだけだと思っていました...xmlの取得に2日を費やしましたEventFeedオブジェクトに戻り、代わりにEventFeedからデータテーブルにEventEntryを保存するように切り替えました。
そのため、フィードをXML 1.0に簡単に保存できましたが、GData EventFeedに読み戻すのは別の話でした-GoogleはmyFeed.saveToXMLを提供しますが、loadfromXMLメソッドは提供しません:-/したがって、System.Runtime.Serializationを追加しようとしました。次のようなものを使用するには:
Dim reader As XmlReader = XmlReader.Create(fileName)Dim rssFeed As SyndicationFeed = SyndicationFeed.Load(reader)
これは最初は有望に見えましたが、データがすべてrssFeedにあるわけではありません。さらに、必要なメソッドを呼び出す前に、データをGoogle.GData.Calendar.EventFeedに戻す必要があります。どちらかを行う方法を理解します。rssFeedから新しいEventEntryにデータの最も重要なビットをコピーするか、重要なデータを抽出することでデータテーブルで同じことを行うことができると思います...しかし、それは非常にエレガントではなく、将来的には危険です。
私が今どちらの方向に向けるべきかという考えはありますか?私は間違った木を吠えていますか?
ありがとう、ニール
VB .NET 3.5 VS 2008
c# - IXmlSerializable インターフェイスの実装時に文字列の null 値を処理する
IXmlSerializable を実装する次のクラスがあります。WriteXml() を実装するときは、このクラスの文字列メンバーが null 値である可能性がある場合を処理する必要があります。これを処理する最良の方法は何ですか?
現在、すべての文字列プロパティが空の文字列値に初期化されるデフォルトのコンストラクターを使用しています。このようにすると、WriteXml() が呼び出されたときに、文字列は null になりません。
これを行うもう 1 つの方法は、各文字列を xml に書き込む前に String.IsNullOrEmpty を使用してチェックすることです。
このコードを改善する方法について何か提案はありますか?
vb.net - IXmlSerializable 辞書の問題
Dictionary
を実装するジェネリックを作成しようとしていましたIXmlSerializable
( Charles Fedukeの功績によるものです)。
ここに私の試用版があります:
結果:
WriteXml メソッドの上にブレークポイントを配置しました。停止すると、ライターにはデータがまったく含まれておらず、ルート要素と xml 宣言が含まれている必要があります。
xml-serialization - シリアライズされたメンバーを属性としてシリアライズする方法はありますか?
シリアライズされたメンバーを属性としてシリアライズする方法はありますか:
このクラスが xml シリアル化されている場合よりも、次のように生成する必要があります。
つまり、Name プロパティを要素としてシリアル化するのではなく、xml 属性としてシリアル化する必要があるということです。