【问题标题】:Error deserializing a custom tuple in WCF在 WCF 中反序列化自定义元组时出错
【发布时间】:2014-11-01 19:40:43
【问题描述】:

在 WCF 函数中反序列化结果集(元组)时出现以下错误。

尝试反序列化参数 XXX 时出错。有关详细信息,请参阅 InnerException。

'System.Tuple' 不能被序列化。考虑使用 DataContractAttribute 属性对其进行标记,并使用 DataMemberAttribute 属性标记您想要序列化的所有成员。或者,您可以确保该类型是公共的并且有一个无参数的构造函数 - 然后该类型的所有公共成员都将被序列化,并且不需要任何属性。

下面是元组定义。

公共课 XXX 公共属性 aaa 作为新列表(元组(bbb,ccc)) 结束课

【问题讨论】:

  • 内部异常说什么,这并没有提供足够的信息。
  • 能贴出反序列化代码吗?
  • 公共函数 EndXXX(ByVal result As System.IAsyncResult) As XXX 实现 EndXXX Dim _args((0) - 1) As Object Dim _result As XXX = CType(MyBase.EndInvoke("XXX", _args , result), XXX) 返回_result结束函数

标签: web-services wcf silverlight serialization deserialization


【解决方案1】:

不合时宜地,您需要创建一个类而不是使用元组。异常说您不能使用元组,因为 A) 它没有标记 DataContract 属性和 B) 因为它没有无参数构造函数。因此,Tuple<int,string> 不能设置为 new Tuple<int,string>();

如果你通过 WCF 发送的课程是这样的......

public class MyClassToSendThroughWcf
{
    public tuple<int,string> MyData {get;set;} //The tuple here is problem, replace with the class below...
}

您可以将“MyData”的类型替换为执行相同操作的类...

public class MyClassToUseWithWcf
{
    public MyClassToUseWithWcf(){}

    public MyClassToUseWithWcf(int i, string s)
    {
        Item1 = i;
        Item2 = s;
    }

    public int Item1 {get;set;}
    public string Item2 {get;set;}
}

现在,两个类都有默认构造函数,所以可以序列化。我建议还是避免使用元组。

【讨论】:

  • 我确实为该类使用了 DataContract 属性。
  • 您可能已将属性添加到包含 tupel 的类中,但我认为您不能将属性添加到 tupel 结构本身。我在这个答案中显示的类是你的 tupel 的替代品,它将与 WCF 一起使用。
  • 我在回答中添加了一些说明。
猜你喜欢
  • 2012-01-20
  • 2020-09-09
  • 2011-07-29
  • 2021-03-08
  • 1970-01-01
  • 2010-11-01
  • 2018-06-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多