C# 如何在WCF中序列化对象类型?
我有一个Dto模型类:C# 如何在WCF中序列化对象类型?,c#,wcf,serialization,C#,Wcf,Serialization,我有一个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) {
[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的WCF调用不正常,并引发序列化异常
如何在服务调用中传输obj 3和4?在WCF通信中,必须明确指定序列化的类型。这确保了客户端和服务器在通信期间都能识别自定义类型。将数据成员标记为对象违反了WCF设计模式。根据您的场景,可以使用Datatable类型,但不推荐使用此类型。
建议您在设计数据协定时指定需要序列化的数据类型。例如,我们可以考虑使用列表[t]。
如果有什么我可以帮忙的,请随时告诉我。顺便说一句,创建这样一个允许传递任何旧对象的契约是一种反模式。您永远不知道允许发送什么,服务也永远无法预测它将收到什么。最终的结果是,您不知道该服务可以执行什么操作,该代码现在已在应用程序中实现和使用,无法重新实现,有没有解决此问题的方法?@MickyD
[Serializable]
和[DataMember]
不属于同一类。两个不同的序列化程序。“现在在应用程序中使用,不可能重新实现”-考虑到您将遇到序列化异常
始终是“重新实现”的时候了