XmlSerializer空の変数をシリアル化して両方のタグを使用しますか?
-
05-07-2019 - |
質問
シリアル化されたxmlクラスをSoap Envelopeにロードできるようにしたい。私は始めているので、内臓を満たしていないので、次のように見えます:
<Envelope
xmlns="http://schemas.xmlsoap.org/soap/envelope/" />
次のように表示したい:
<Envelope
xmlns="http://schemas.xmlsoap.org/soap/envelope/" ></Envelope>`
私が書いたクラスは次のとおりです。
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.xmlsoap.org/soap/envelope/")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://schemas.xmlsoap.org/soap/envelope/",ElementName="Envelope", IsNullable = true)]
public class TestXmlEnvelope
{
[System.Xml.Serialization.XmlElement(ElementName="Body", Namespace="http://schemas.xmlsoap.org/soap/envelope/")]
public System.Collections.ArrayList Body = new System.Collections.ArrayList();
} //class TestXmlEnvelope`
これを例として使用しているのは、他の人が個々の要素でそれを望んでいるからです。これは単純なものでなければならないと確信していますが、悲しいことに、これに適したキーワードがわかりません。
いつもお世話になりました。
[編集]この命令を使用しようとするとエラーが発生します
System.Xml.Serialization.XmlSerializer xmlout = new System.Xml.Serialization.XmlSerializer(typeof(TestXmlEnvelope));
System.IO.MemoryStream memOut = new System.IO.MemoryStream();
xmlout.Serialize(memOut, envelope, namespc);
Microsoft.Web.Services.SoapEnvelope soapEnv = new Microsoft.Web.Services.SoapEnvelope();
soapEnv.Load(memOut);
エラー<!> quot;ルート要素が見つかりません<!> quot;。
[編集]エラーを修正しました。オブジェクトをシリアル化した後、memOut.Position = 0を設定しなかったという問題でした。それでも、この質問が他の人に役立つことを願っています。
解決
ここでの主な問題は、終了タグを書き込むときに、XmlSerializer
がWriteEndElement()
でXmlWriter
を呼び出すことです。ただし、これにより、コンテンツがない場合に省略形の<tag/>
フォームが生成されます。 WriteFullEndElement()
は終了タグを個別に書き込みます。
シリアライザーがその機能を示すために使用する中央に独自のXmlTextWriter
を挿入できます。
serializer
が適切な<=>であることを考えて、これを試してください:
public class XmlTextWriterFull : XmlTextWriter
{
public XmlTextWriterFull(TextWriter sink) : base(sink) { }
public override void WriteEndElement()
{
base.WriteFullEndElement();
}
}
...
var writer = new XmlTextWriterFull(innerwriter);
serializer.Serialize(writer, obj);
[編集]追加したコードの場合、次のファサードコンストラクターを追加します。
public XmlTextWriterFull(Stream stream, Encoding enc) : base(stream, enc) { }
public XmlTextWriterFull(String str, Encoding enc) : base(str, enc) { }
次に、前と同様に、コンストラクターでメモリストリームを内部ストリームとして使用します。
System.IO.MemoryStream memOut = new System.IO.MemoryStream();
XmlTextWriterFull writer = new XmlTextWriterFull(memOut, Encoding.UTF8Encoding); //Or the encoding of your choice
xmlout.Serialize(writer, envelope, namespc);
他のヒント
記録に関する注意:OPは *** Microsoftを使用していました。*** Web.Services.SoapEnvelope クラス。これは非常に廃止されたWSE 1.0製品の一部です。このクラスはXmlDocumentクラスから派生しているため、XmlDocumentでも同じ問題が発生する可能性があります。
新しい開発にWSEを使用してはいけません。また、既に使用されている場合は、できるだけ早くコードを移行する必要があります。 WCFまたはASP.NET Web APIは、今後の.NET Webサービスに使用される唯一のテクノロジーです。
2つの表現は同等です。後者の形式で表示する必要があるのはなぜですか?