【问题标题】:WCF Data serializationWCF 数据序列化
【发布时间】:2012-05-12 00:05:51
【问题描述】:

使用 WCF 应该如何修改此 DataContract 或代码:

<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>

提前致谢!!

【问题讨论】:

  • 在我看来,你不应该关心序列化是如何工作的。那是您的应用程序代码不应依赖的 WCF 的内部细节。您是否尝试从非 WCF 客户端使用此服务?如果您是那么简单的序列化可能更适合您,例如 JSON。
  • 如果你有一个指定的要求,你需要在下面的结构中拥有它,最简单的方法是使用 vs.net 命令提示符下的 xsd.exe 工具从 xml 生成一个示例类

标签: wcf xml-serialization


【解决方案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

【讨论】:

  • .. 元素在哪里?
  • ItemName 属性的CollectionDataContract 属性。
  • CollectionDataContract 属性的 ItemName 属性是“listaActos”.. 可能是该海豚的 DataContract Name:="listaActos" 和 CollectionDataContract Name="codigoActo" 并准确显示预期的 xml 输出?
  • 如果您希望项目名称为您在问题中的“codigoActo”,则必须将ItemName 设置为此。我的代码显示了与您相同的 XML(它没有“a”前缀,但元素位于正确的命名空间中)。
猜你喜欢
  • 2011-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多