2013-11-15 5 views
5

C#では、オブジェクトのリストを持つオブジェクトをシリアル化すると、リストもシリアル化されますか?C#オブジェクトのリストを含むオブジェクトをシリアル化する

public class Move { 
    public string MoveName {get; set;} 

    public List<Tag> oTags = new List<Tag>; 
} 

public class Tag { 
    public string TagName {get; set;} 
} 

私は動きをシリアル化した場合の動きに保存されているすべてのタグも同様にシリアル化されますか?また、それがリストをシリアライズしない場合、私はそれを行うことについてどのように行くだろうか?

<Move> 
    <MoveName>name</MoveName> 
    <Tag>Value</Tag> 
    ... 
</Move> 
+0

現在の回答に関係なく、あなたはそれをシリアル化していますか?たとえば、 'XmlSerializer'を使用すると、それは動作します。 (特殊な属性や創造性を使用して、特定のXMLスキーマの出力を得る必要があるかもしれませんが) –

+0

XmlSerializerを使用しています –

+1

どのようにスキーマを使いますか?多くのタグをどのように扱うかは少し曖昧です。 'の名前値1値2 ...値N '?また、 'Move'クラスと' Tag'クラスを柔軟に変更できますか? –

答えて

9

はいを​​、試してみてくださいする必要があります彼XmlSerializerList<T>T(またはあなたのケースではTag)がシリアライズ可能である限り、それはシリアル化されます。

​​

これは、としてあなたの現在のクラス構造を使用して出力します

<?xml version="1.0" encoding="utf-16"?> 
<Move xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <oTags> 
    <Tag> 
     <TagName>Value1</TagName> 
    </Tag> 
    <Tag> 
     <TagName>Value2</TagName> 
    </Tag> 
    <Tag> 
     <TagName>Value3</TagName> 
    </Tag> 
    </oTags> 
    <MoveName>MyName</MoveName> 
</Move> 

私はあなたの現在のXMLスキーマを一致させる方法を見つけることができるかどうか私はわかりますが、あなたはXmlAttributesを適用する方法を見上げるとすることができますあなた自身でそれを楽しんでください。


EDIT:

次XMLATTRIBUTESを使用するようにクラス宣言を変更した場合、あなたはあなたの例のように、正確なXMLスキーマを達成します:シリアル化されたが生成されます

public class Move 
{ 
    [XmlElement(Order = 1)] 
    public string MoveName {get; set;} 

    [XmlElement(Order = 2, ElementName = "Tags")] 
    public List<Tag> oTags = new List<Tag>(); 
} 

public class Tag 
{ 
    [XmlText] 
    public string TagName {get; set;} 
} 

<?xml version="1.0" encoding="utf-16"?> 
<Move xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <MoveName>MyName</MoveName> 
    <Tags>Value1</Tags> 
    <Tags>Value2</Tags> 
    <Tags>Value3</Tags> 
</Move> 
+0

これは私がスキームを探しているものと一致しませんが、 。ブレンダン・ヒルのリンクは、私が望むレイアウトのためにそれをどのように設定するかについて、私にかなり良い考えを与えてくれました。ありがとうございました。 –

+0

@maxinfet:私の編集/更新をチェックして、あなたのスキーマに一致する出力を生成する属性のセットを見つけました。 –

+0

@maxinfet:また、シリアライズコードを少し傷つけました。すでにコピー/ペーストしていた場合は、再チェックしてください。 –

1

デフォルトでは、リスト内の項目はシリアル化されない可能性があるため、デフォルトでは表示されません。

、彼らがしている場合は、userful以下のページを見つけることがあります。

XML Serialize generic list of serializable objects

3

は、あなたのクラス宣言は、あなたの質問に正しいことを確認していますか? あなただけPublic Moveを宣言している、それはPublic class Move

このコードトンを使用して

XmlSerializer serializer = new XmlSerializer(typeof(YourClass)); 
あなたのケースでは

Move m = new Move(); 
      m.oTags.Add(new Tag() { TagName = "X" }); 
      m.oTags.Add(new Tag() { TagName = "XX" }); 

      XmlSerializer x = new XmlSerializer(typeof(Move)); 
      System.IO.Stream s; 

      var xmlwriter = System.Xml.XmlWriter.Create("C:\\MXL.txt"); 
      x.Serialize(xmlwriter, m); 

アウトプット

<?xml version="1.0" encoding="utf-8"?> 
    <Move xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <oTags> 
<Tag> 
    <TagName>X</TagName> 
</Tag> 
<Tag> 
    <TagName>XX</TagName> 
</Tag> 
</oTags></Move> 
関連する問題