2009-03-20 4 views
1

私はデザインの決定に混乱しているかもしれません。厳密に型指定されたカスタムオブジェクトのコレクションを使用する代わりに、汎用リストを使用しました。基本的に、私が持っているものである:出願を通して 強く型付けされたオブジェクトのリストをシリアライズ

public class AreaFields 
{ 
    [XmlArray("Items")] 
    [XmlArrayItem("Item")] 
    public List<Fields> Fields { set; get; } 

    [XmlAttribute] 
    int id { set; get; } 
} 

public class Fields 
{ 
    [XmlAttribute] 
    public string Name { set; get; } 
} 

は、私が今 List<AreaFields>を使用している、私はXMLにリストをシリアル化を必要としています。私は何を得るために期待していますと、次のとおりです。

<SomeXMLTag> 
    <AreaFields id='1000'> 
    <Items> 
     <Item Name="Test1" /> 
     <Item Name="Test2" /> 
    </Items> 
    </AreaFields> 
    <AreaFields id='1001'> 
    <Items> 
     <Item Name="Test1" /> 
     <Item Name="Test2" /> 
    </Items> 
    </AreaFields> 
    </SomeXMLTag> 

私は>リスト<をシリアル化することはできません(または私はできますか?)、私はリストのすべての項目をシリアル化する必要がありますので。

Ex: List<AreaFields> list = new List<AreaFields>(); 
// more code to add to list 
    list[0].GetRawXML(); //A method i have to serialize 

答えて

5

ラッパークラスが必要です。 MyWrapperのインスタンスをシリアル化して、あなたの例に従ってxmlを取得します。

[XmlRoot("SomeXMLTag")] 
public class MyWrapper 
{ 
    [XmlElement("AreaFields")] 
    public List<AreaFields> AreaFields { get; set; } 
} 

public class AreaFields 
{ 
    [XmlArray("Items")] 
    [XmlArrayItem("Item")] 
    public List<Fields> Fields { set; get; } 

    [XmlAttribute] 
    public int id { set; get; } 
} 

public class Fields 
{ 
    [XmlAttribute] 
    public string Name { set; get; } 
} 
4

リスト<>をシリアル化できます。私が使った属性についてはhereを読んでください。

+0

genericリストもシリアライズしました –

0
using System; 
using System.Collections.Generic; 
using System.Xml; 
using System.Xml.Serialization; 
using System.Text; 
using System.IO; 

namespace Utils 
{ 
    public class XMLSerializer 
    { 
     public static Byte[] StringToUTF8ByteArray(String xmlString) 
     { 
      return new UTF8Encoding().GetBytes(xmlString); 
     } 

     public static String SerializeToXML<T>(T objectToSerialize) 
     { 
      StringBuilder sb = new StringBuilder(); 

      XmlWriterSettings settings = 
       new XmlWriterSettings {Encoding = Encoding.UTF8, Indent = true}; 

      using (XmlWriter xmlWriter = XmlWriter.Create(sb, settings)) 
      { 
       if (xmlWriter != null) 
       { 
        new XmlSerializer(typeof(T)).Serialize(xmlWriter, objectToSerialize); 
       } 
      } 

      return sb.ToString(); 
     } 

     public static void DeserializeFromXML<T>(string xmlString, out T deserializedObject) where T : class 
     { 
      XmlSerializer xs = new XmlSerializer(typeof (T)); 

      using (MemoryStream memoryStream = new MemoryStream(StringToUTF8ByteArray(xmlString))) 
      { 
       deserializedObject = xs.Deserialize(memoryStream) as T; 
      } 
     } 
    } 
} 

リストを印刷したいときに、実行します。

List<AreaFields> list = new List<AreaFields>(); 
// more code to add to list 
Console.WriteLine(Utils.XMLSerializer.SerializeToXML(areaFields)); 

EDIT:バイナリ変換のいずれかを避けるために変更シリアライザを。シリアライズするすべてのプロパティをパブリックにする必要があり、パラメータを持たないコンストラクタも必要です。

+0

XmlWriterのソースとしてStringWriterを使用して、.ToString()を呼び出すだけで、バイナリのエンコーディング/デコードでは処理が遅くなることはありません。 –

+0

良い点。また、System.Xml.Serialization.XmlSerializerとの競合を避けるために、独自の名前空間にある必要があります。これはコードから取り除いたときに追加するのを忘れてしまいました。 –

-2

Javaジェネリックは、タイプ消去によって動作します。これは、アプリが実際に動作しているときにJVMがジェネリックを気にしないということです。コンパイラはそれらに注意を払い、バイトコードからそれらを破棄します(特定の注釈は.classファイルなどに入れられますが)。

ジェネリック型のオブジェクトをシリアライズおよびデシリアライズするのは簡単です。それはリストとして逆順化し、それをキャストします。

関連する問題