2012-05-11 22 views
1

與WCF的工作應該如何修改這個DataContract或代碼:WCF數據序列

<DataContract()> 
Public Class listaActos 
Private _codigoActo As List(Of String) 

<DataMember(IsRequired:=True)> 
Public Property codigoActo() As List(Of String) 
    Get 
     Return _codigoActo 
    End Get 

    Set(ByVal value As List(Of String)) 
     _codigoActo = value 
    End Set 
End Property ... 

序列化時產生以下響應XML:

<a:listaActos> 
    <a:codigoActo xmlns:b="http://schemas.microsoft.com/2003/10/Serialization/Arrays"> 
      <b:string>01672</b:string> 
    </a:codigoActo> </a:listaActos> 

但我想博如下:

<a:listaActos> 
    <a:codigoActo>01672</a:codigoActo> 
    <a:codigoActo>01673</a:codigoActo> 
    <a:codigoActo>01674</a:codigoActo></a:listaActos> 

在此先感謝!

+2

在我看來,你不應該關心序列化是如何工作的。這是WCF的內部細節,應用程序代碼不應該依賴它。您是否嘗試從非WCF客戶端使用此服務?如果你是一個簡單的序列化可能對你更好,比如JSON。 –

+0

如果你有一個指定的需求,你需要在下面的結構中使用它,最簡單的方法是使用vs.net命令提示符 – Rajesh

回答

1

如果您的類listaActos只包含其中的codigoActo列表,則可以將其設置爲集合類型(例如,使其繼承自List(Of String))。這將爲您帶來想要的DataContractSerializer的XML形狀。

如果它有更多的成員,那麼你需要使用XmlSerializer,並定義類。

下面的代碼顯示了列表選項。

Public Class StackOverflow_10554490 
    <CollectionDataContract(Name:="listaActos", Namespace:="http://my.namespace", ItemName:="codigoActo")> _ 
    Public Class listaActos 
     Inherits List(Of String) 
    End Class 

    <DataContract(Name:="Root", Namespace:="http://my.namespace")> _ 
    Public Class Root 
     <DataMember()> _ 
     Public Property listaActos As listaActos 
    End Class 

    Public Shared Sub Test() 
     Dim list As listaActos = New listaActos() 
     list.Add("01672") 
     list.Add("01673") 
     list.Add("01674") 
     Dim root = New Root With {.listaActos = list} 
     Dim dcs = New DataContractSerializer(GetType(Root)) 
     Dim ms = New MemoryStream() 
     dcs.WriteObject(ms, root) 
     Console.WriteLine(Encoding.UTF8.GetString(ms.ToArray())) 
    End Sub 
End Class 
+0

中的xsd.exe工具從xml生成一個示例類。其中是元素 ? – David

+0

「CollectionDataContract」屬性的'ItemName'屬性。 – carlosfigueira

+0

CollectionDataDataContract屬性的ItemName屬性是「listaActos」..可能是該門廊的DataContract Name:=「listaActos」和CollectionDataContract Name =「codigoActo」,並顯示了預期的xml輸出。 – David