如何在 WCF 中序列化对象类型?

Posted

技术标签:

【中文标题】如何在 WCF 中序列化对象类型?【英文标题】:How to serialize object type in 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,总是时候“重新实现” 【参考方案1】:

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

【讨论】:

以上是关于如何在 WCF 中序列化对象类型?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 WCF 中没有无参数构造函数的情况下序列化对象?

WCF反序列化如何在不调用构造函数的情况下实例化对象?

如何使用 wcf REST 服务获取自定义对象的 json 响应?

如何在 WCF 中将 Noda Time(或任何第三方类型)对象作为参数传递?

WCF 奇怪的 ReadOnlyDictionary 序列化

WCF + REST,增加 MaxStringContentLength