2

オブジェクトを「オブジェクト」フィールドを持つ XML にシリアライズしようとしています。名前空間や属性のない XML を実現したい。ルート要素の名前空間を削除することはできますが、Object 要素には名前空間が残っています。

シリアル化するオブジェクト;

public class Message {
        public String Metadata { get; set; }
        public Object Payload { get; set; }


        public Message() {
        }

        public Message(String Metadata, Object Payload) {
            this.Metadata = Metadata;
            this.Payload = Payload;
        }
    }

シリアル化する方法;

var s = new System.Xml.Serialization.XmlSerializer(typeof(Message));
var ns = new System.Xml.Serialization.XmlSerializerNamespaces();
ns.Add(String.Empty, String.Empty);
StringWriter writer = new StringWriter();
s.Serialize(writer, payload, ns);
writer.Close();

私の出力:

<Message>
  <Metadata>myMetadata</Metadata>
  <Payload xmlns:q1="http://www.w3.org/2001/XMLSchema" d2p1:type="q1:string" xmlns:d2p1="http://www.w3.org/2001/XMLSchema-instance">myPayload</Payload>
</Message>

私の理想的な出力:

<Message>
  <Metadata>myMetadata</Metadata>
  <Payload>myPayload</Payload>
</Message>

私は Java 開発者で、C# を使用するのは今日が初めてです。明らかな何かが欠けている場合はお詫び申し上げます。

(私の主な目標は、最終的に次の出力を得ることです)

<Message>
  <Metadata>myMetadata</Metadata>
  <Payload class="aClass">myPayload</Payload>
</Message>

しかし、上記の問題の解決策を見つけたら、自分で調べることができます!

4

1 に答える 1

3

この属性は、プロパティtypeを逆シリアル化できるようにするために必要です。Payloadシリアライザがコンテンツのタイプを認識していない場合、どうすればデシリアライズできますか?

XmlSerializerNamespaces通常、名前空間はルート要素に追加されますが、空のマッピングでa を指定することで明示的に防止したため、Payload代わりに名前空間が要素に追加されます。

を使用する場合XmlSerializer、できる最善の方法は次のとおりです。

<Message xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Metadata>myMetadata</Metadata>
  <Payload xsi:type="xsd:string">myPayload</Payload>
</Message>

もちろん、名前空間を使用せずに XML を手動で生成することもできますが、Payload逆シリアル化の型を知る何らかの方法が必要になります。

于 2013-07-17T16:16:24.250 に答える