2011-12-14 6 views
0

オブジェクトをシリアル化すると、XmlSerializerにXMLルート要素または "Wrapper"を追加することはできますか?XmlSerializer既定のXmlRootでシリアライズ

私が探していますXMLは、このようなものになるだろう:

<Groups> 
    <Group method="ModifySubGroups" ID="1234" PIN="5678"> 
     <SubGroup action="Delete" number="95"> 
      <Name>Test</Name> 
     </SubGroup> 
    </Group> 
</Groups> 

私は二つのクラス、グループおよびサブグループを持っています。グループには、サブグループの一般的なリストが含まれています。素晴らしいですが、私はXMLルート "グループ"を持っていません。グループおよびサブグループは、この生成二つのクラスの使用:

<Group method="ModifySubGroups" ID="1234" PIN="5678"> 
    <SubGroup action="Delete" number="95"> 
     <Name>Test</Name> 
    </SubGroup> 
</Group> 

を、私は仕事にそれを得ることができる唯一の方法は、グループが含まれて別のクラス「グループ」を作成することでした。だから私は3つのクラス、グループ、グループ、およびサブグループがあります。グループにはグループが含まれ、グループにはサブグループが含まれます。

他のアイデアはありますか?

答えて

4

あなたは通常、XMLをきれいにするためにXMLシリアル化を使用しません。ルートコンテナ要素が必要な場合は、ルートコンテナオブジェクトを用意して、Groupオブジェクトの代わりにそれをシリアル化する必要があります。

ただしGroupオブジェクト

void Main() 
{ 
    var g = new Group(); 
    g.SubGroups.Add(new SubGroup {Name = "aaa"}); 

    var ser = new XmlSerializer(typeof(Group[]), new XmlRootAttribute("Groups")); 
    using (var w = new StringWriter()) 
    { 
     ser.Serialize(w, new Group[] {g}); 
     w.ToString().Dump(); 
    } 
} 

public class Group 
{ 
    [XmlElement("SubGroup")] 
    public List<SubGroup> SubGroups = new List<SubGroup>(); 
} 

public class SubGroup 
{ 
    public string Name; 
} 

の配列は、当然のことながら、これはデシリアライズコードは魔法の1が常に存在することを知っているだけ1族元素あるいは0以上があるかもしれないと仮定するのいずれかの必要があることを意味しシリアライズすることができます。正直なところ、あなたが実際にグループのコレクションをシリアライズしない限り、これを行うにあたって多くの点は分かりません。それはちょうど混乱を加えます。

+0

私はこれを支配していません。 Webサービスを提供するベンダーは、このようにする必要があります。そしてこれはうまくいく。ありがとう! – vincentw56

+0

@ vincentw56既存のスキーマの場合、私の編集した回答を参照してください。 – vittore

+0

に準拠する必要があります。注:メモリリークの可能性があります。 http://msdn.microsoft。com/ru-ru/magazine/cc163491.aspx – Evgeny

0

編集:実際にベンダーのスキーマに準拠したい場合は、間違った点から開始しています。 このようなクラスを実装する必要はありません。ベンダーのXSDを使用し、Visual Studioに付属のxsd utilityを使用してスキーマから.netクラスを生成するだけで、オブジェクトのシリアル化方法を選択できます(あなたは私が言うより優れた柔軟性を提供します)XmlSerializerまたはDataContractSerializer

注:あなたは1を持っていないと

自分でそれを記述する方法がわからない場合、あなたはあなたのXMLからXSDを生成するためのいくつかのツールを使用することができますXmlRootAttributeを使用してカスタムXMLルートを指定することができます

また、コレクションを指定することができます - Array Serializing

+0

XmlSerializerのコンストラクタでこれを行うと、単に "Group"が "Groups"に置き換えられます。ルート要素または "ラッパー"は追加されません。 – vincentw56

+0

'XmlArray'と' XmlArrayItem'はルート要素では機能しません。 –

+0

この場合、XML属性をサポートしていないため、データコントラクトは機能しません。 –

関連する問題