如何在 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 REST 服务获取自定义对象的 json 响应?
如何在 WCF 中将 Noda Time(或任何第三方类型)对象作为参数传递?