10

我對使用DataContractSerializer使用基元列表時設置自定義元素名稱的最佳方法感興趣。假設我有以下包含字符串列表作爲DataMember的類。在基元列表上使用DataContractSerializer的自定義元素名稱

[DataContract] 
public class ClassName 
{ 
    [DataMember] 
    public List<String> FieldName { get; set; } 
} 

默認情況下,這個序列化到以下幾點:

<ClassName xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <FieldName xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays"> 
    <a:string>Value 1</a:string> 
    <a:string>Value 2</a:string> 
    <a:string>Value 3</a:string> 
    </FieldName> 
</ClassName> 

我想使XML儘可能簡單通過XSLT轉換所以最好我將標籤重命名爲更有用的東西,像價值。

一個可能的解決方案涉及創建一個擴展Collection併爲CollectionDataMember參數設置ItemName的類,該類我找到了here。我想知道是否有一種方法可以實現相同的目標,而不需要這個額外的類或其他形式的包裝類。 XML序列化程序使用XMLArray和XMLArrayItem參數來完成此操作,但DataContractSerializer似乎沒有類似的功能。

感謝您的任何提示或想法!

+0

另一種選擇可能是您創建一個類被稱爲「價值:字符串」從System.String繼承和使用,在該數據成員... – Nabheet 2013-02-08 17:29:45

+1

@NabheetSandhu'System.String'密封。你不能從它繼承。 – 2013-03-21 18:26:48

回答

0

您的選擇有限。 DataContractSerializer不是爲了生成漂亮的XML而設計的。 WCF使用它本質上不是人眼友好的。因此,您可以通過使用字符串屬性定義自定義類型來最大限度地減少名稱空間使用和名稱元素。

7

定義數據協定以表示字符串列表並將其用作FieldName屬性的類型。然後,您可以使用CollectionDataContract屬性來自定義XML。

[CollectionDataContract(ItemName="Value")] 
public class MyList : List<string> {} 

[DataMember] 
public MyList FieldName { get; set; } 
+0

+1 - 我不知道該怎麼做。不過,我最近需要這樣做,並使用svcutil從XSD轉到DataContract。這幾乎是svcutil生產的。 – Nabheet 2013-04-22 15:58:40

相關問題