2011-12-21 39 views
5

如何在不使用外部元素的情況下使用Data Contract Serializer來序列化列表?我正在使用.Net 3.5。我有一個包含一個列表中,除其他事項外的一類,即我希望沒有外部元件來序列爲符合相關XSD:Data Contract Serializer - 如何省略集合的外部元素

[DataContract(Name="MyClass")] 
public class MyClass 
{ 
... 
[DataMember(Name="Parameters")] 
public List<Parameter> Parameters; 
... 
} 

[DataContract(Name="Parameter")] 
public struct Parameter 
{ 
    [DataMember(Name="ValueName")]string ValueName; 
    [DataMember(Name="Value")]int Value; 
    public Parameter(string ValueName, int Value) 
    { 
     this.ValueName = ValueName; 
     this.Value = Value;    
    } 
} 

上述序列化如(假設在列表中只有一個參數) :

<MyClass> 
    <Parameters> 
     <Parameter> 
      <ValueName></ValueName> 
      <Value></Value> 
     </Parameter> 
    </Parameters> 
</MyClass> 

我想如下序列化它:

<MyClass> 
     <Parameter> 
      <ValueName></ValueName> 
      <Value></Value> 
     </Parameter> 
</MyClass> 

使用XmlSerializer我可以通過應用[的XmlElement]到列表中做到這一點:

[XmlElement ("Parameter")] 
public List<Parameter> Parameters; 

但是我不想用XmlSerializer,因爲我的學生都沒有被序列化友好的一些屬性,我希望能對付使用屬性的[OnSerializing家族的。

謝謝。

+0

你不必在消息DataContracts在格式化太多的控制。您可能需要使用MessageContract - 請參閱http://msdn.microsoft.com/en-us/library/ms730255.aspx – StuartLC

回答

4

DataContract序列化程序不允許對結果XML進行這種程度的控制,您將不得不使用XmlSerializer來實現此目的。

+0

好的謝謝。每當我尋找某物並找不到時,通常都是因爲它無法完成,或者它是如此愚蠢,沒有人想到這樣做。感謝您確認前者;-) – chrisj

+0

如何使用XmlSerializer來控制結果? – natenho

+0

@natenho看到這個問題,OP已經爲這個問題的底部提供了一個解決方案。 –

0

以下使用MessageContracts的作品雖然是'hack' - 它將「MyClass」元素歸入List成員並排除「MyClass」的包裝器名稱空間。

[ServiceContract(Namespace="")] 
public interface IService1 
{ 
    [OperationContract] 
    MyClass GetParameters(); 
    // TODO: Add your service operations here 
} 

[DataContract(Namespace="")] 
public class Parameter 
{ 
    [DataMember] 
    public string ValueName 
    { 
     get; 
     set; 
    } 
    [DataMember] 
    public int Value 
    { 
     get; 
     set; 
    } 

    public Parameter(string ValueName, int Value) 
    { 
     this.ValueName = ValueName; 
     this.Value = Value; 
    } 
} 

[MessageContract(IsWrapped = false, WrapperNamespace="")] 
public class MyClass 
{ 
    [MessageBodyMember(Name = "MyClass", Namespace = "")] 
    public List<Parameter> Parameters 
    { 
     get; 
     set; 
    } 
} 
3

使用收集的數據合同:

[CollectionDataContract(Name = "MyClass", ItemName = "Parameter")] 
    public class ParameterList : List<Parameter> 
    { 

    } 
+0

我不知道爲什麼有人低估了這個(也許他們可能會對此提出評論。它對我有用,並記錄在這裏:https://msdn.microsoft.com/en-us/library/system.runtime.serialization。 collectiondatacontractattribute(v = vs.90).aspx –

+0

我想這是downvoted,因爲它仍然會導致一個外部元素重複子元素。問題明確要求一種方式來擺脫外部元素。 – Gruff

+0

這個問題並沒有要求擺脫外部元素(MyClass)它要求擺脫下面的(參數)......這正是這個屬性做的! –