【问题标题】:How to serialize object type in WCF?如何在 WCF 中序列化对象类型?
【发布时间】:2020-01-15 21:32:58
【问题描述】:

我有这个 Dto 模型类:

[System.Runtime.Serialization.DataContract, System.Serializable]
public class DataObj
{
    [System.Runtime.Serialization.DataMember]
    public object Value { get; set; }

    public static DataObj CreateDataObj(object obj)
    {
        return new DataObj { Value = obj };
    }
}

static void main()
{
      var obj1 = DataObj.CreateDataObj(10);
      wcfService.Send(obj1);
      var obj2 = DataObj.CreateDataObj("hello");
      wcfService.Send(obj2);
      var obj3 = DataObj.CreateDataObj(new int[]{10, 20,30});
      wcfService.Send(obj3);
      var obj4 = DataObj.CreateDataObj(new string[]{"ht", "fd","xs"});
      wcfService.Send(obj4);
 }

main 方法中,对 obj 1 和 2 的 WCF 调用正常,但对于 obj 3 和 4 则不正常并引发序列化异常。

如何在服务调用中传输 obj 3 和 4?

【问题讨论】:

  • 顺便说一句,创建一个允许传递任何旧对象的合约是一种反模式。您永远不知道允许发送什么,服务也永远无法预测它将接收什么。最终结果是您不知道该服务可以执行哪些操作
  • 哦,这段代码现在已经在应用中实现和使用,无法重新实现,请问有什么办法解决这个问题吗?@MickyD
  • [Serializable][DataMember] 不属于一起。两个不同的序列化器。
  • “现在在应用程序中使用,不可能重新实现” - 考虑到你得到serialisation exceptions,总是时候“重新实现”

标签: c# wcf serialization


【解决方案1】:

在 WCF 通信中,我们必须明确指定序列化的类型。这样可以确保客户端和服务器在通信过程中都能识别自定义类型。将数据成员标记为对象违反了 WCF 设计模式。根据您的情况,可以使用 Datatable 类型,但已弃用。
https://www.c-sharpcorner.com/UploadFile/deepak.sharma00/how-to-return-a-datatable-from-wcf-service/
建议您在设计数据契约时指定需要序列化的数据类型。例如,我们可以考虑使用 List[T]。
如果有什么可以帮助的,请随时告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 2020-12-25
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多