2009-06-29 15 views
9

を挿入するためにXmlSerializerを使用してください:それは、私がこのオブジェクトをシリアル化するためにXmlSerializerクラスを使用する場合どのように私は、私は次のクラス定義したXML文字列

Root t = new Root 
     { Name = "Test", 
      XmlString = "<Foo>bar</Foo>" 
     }; 

public class Root 
{ 
    public string Name; 
    public string XmlString; 
} 

をし、オブジェクトを作成しました私はシリアル化されたXMLとしてを得ることができるように、それは私のXmlStringコンテンツをエンコードしないで作るのですかどのよう

<Root> 
    <Name>Test</Name> 
    <XmlString>&lt;Foo&gt;bar&lt;/Foo&gt;</XmlString> 
</Root> 

:XMLを返します。

<XmlString><Foo>bar</Foo></XmlString> 

おかげで、 イアン

答えて

1

これが可能だった場合、私は非常に驚くだろう。これを行うことが可能であったとしましょう。あなたがXMLに不正な形式のXMLを作成した場合に起こることは、すべてが壊れることになります。

このケースでは、独自のシリアル化を記述するか、XmlStringフィールドがfooフィールドを含む構造体になるようにする必要があります。

2

IXmlSerializable interfaceにはXmlWriter.WriteRawを使用できます。しかしgarethmが指摘しているように、あなた自身のシリアル化コードを書く必要があります。

using System; 
using System.Xml; 
using System.Xml.Schema; 
using System.Xml.Serialization; 

namespace ConsoleApplicationCSharp 
{ 
    public class Root : IXmlSerializable 
    { 
    public string Name; 
    public string XmlString; 

    public Root() { } 

    public void WriteXml(System.Xml.XmlWriter writer) 
    { 
     writer.WriteElementString("Name", Name); 
     writer.WriteStartElement("XmlString"); 
     writer.WriteRaw(XmlString); 
     writer.WriteFullEndElement(); 
    } 

    public void ReadXml(System.Xml.XmlReader reader) { /* ... */ } 
    public XmlSchema GetSchema() { return (null); } 
    public static void Main(string[] args) 
    { 
     Root t = new Root 
     { 
     Name = "Test", 
     XmlString = "<Foo>bar</Foo>" 
     }; 
     System.Xml.Serialization.XmlSerializer x = new XmlSerializer(typeof(Root)); 
     x.Serialize(Console.Out, t); 
     return; 
    } 
    } 
} 

プリント

<?xml version="1.0" encoding="ibm850"?> 
<Root> 
    <Name>Test</Name> 
    <XmlString><Foo>bar</Foo></XmlString> 
</Root> 
+0

デシリアライズもしていますか? – configurator

+0

ReadXml(XmlReaderリーダー)メソッドを実装する場合は、はい。 – VolkerK

1

これを試してみてください。

public class Root 
{ 
    public string Name; 
    public XDocument XmlString; 
} 

Root t = new Root 
     { Name = "Test", 
      XmlString = XDocument.Parse("<Foo>bar</Foo>") 
     }; 
13

あなたがそうのような特別な注意を必要とするだけの要素にカスタムシリアライズを制限することができます。

public class Root 
{ 
    public string Name; 

    [XmlIgnore] 
    public string XmlString 
    { 
     get 
     { 
      if (SerializedXmlString == null) 
       return ""; 
      return SerializedXmlString.Value; 
     } 
     set 
     { 
      if (SerializedXmlString == null) 
       SerializedXmlString = new RawString(); 
      SerializedXmlString.Value = value; 
     } 
    } 

    [XmlElement("XmlString")] 
    [Browsable(false)] 
    [EditorBrowsable(EditorBrowsableState.Never)] 
    public RawString SerializedXmlString; 
} 

public class RawString : IXmlSerializable 
{ 
    public string Value { get; set; } 

    public XmlSchema GetSchema() 
    { 
     return null; 
    } 

    public void ReadXml(System.Xml.XmlReader reader) 
    { 
     this.Value = reader.ReadInnerXml(); 
    } 

    public void WriteXml(System.Xml.XmlWriter writer) 
    { 
     writer.WriteRaw(this.Value); 
    } 
} 
+0

+1、私は自分のクラスでこれを好むだろうルート:IXmlSerializableアプローチ。 – VolkerK

関連する問題