WCF序列化类的数组的结构

时间:2014-07-31 13:16:55

标签: arrays vb.net wcf serialization

我有类似流动的两个简单类:

<DataContract> _
Public Class C1
    Public Sub New(x_ As Int64)
        _x= x_
    End Sub
    <DataMember()> _
    Public Property x As Int64
End Class

<DataContract> _
Public Class C2
    Public Sub New(y_ As string)
        _y= y_
    End Sub
    <DataMember()> _
    Public Property y As string
End Class

以及由以下两者组成的以下结构:

<DataContract, StructLayout(LayoutKind.Sequential), _
 KnownType(GetType(C1)), KnownType(GetType(C2))> _
Public structure S1
    <DataMember, MessageHeaderArray> _
    Public Second() As C1
    <DataMember> _
    Public First As C2
End structure

最后,我从服务器的接口调用一个sub来发送这些结构的数组,如下所示:

<ServiceContract(CallbackContract:=GetType(IClient))> _
Public Interface IServer
    <OperationContract> _
    Sub SendToServer(ByVal S()As S1)
End Interface

问题是当我尝试使用WCF传递此信息时,我遇到以下格式的奇怪异常:

  

NetDataContractSerializer不支持使用类型“S1”作为只获取集合。请考虑使用CollectionDataContractAttribute属性或SerializableAttribute属性标记类型,或者向属性添加setter。

我尝试使用这两个建议的属性,但我发现它们应该用于声明类型public class xx(Of T)的新类集合,而不是我的情况(一个例外,说明使用时),我真的可以'了解他所说的哪个get-only属性,因为我没有,无论如何,从结构中删除Public Second() As C1,或传递数组结构实例的一个实例,修复了问题。

所以我尝试将S1更改为类而不是结构,并将数组更改为带有get&amp;的List。设置零件,但没有任何帮助,任何线索是什么在这里?

1 个答案:

答案 0 :(得分:0)

你有使用NetDataContractSerializer的原因吗?除非您尝试支持某些遗留代码,否则我相信您应该使用DataContractSerializer。