【发布时间】:2014-09-18 10:44:47
【问题描述】:
示例如下:
[ServiceKnownType("GetKnownTypes", typeof(Helper))]
[ServiceContract]
public interface ICommunicationService
{
[WebInvoke(Method = "POST",
ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Bare,
UriTemplate = "/SendMessage")]
string SendMessage(BusMessage message);
}
[DataContract]
[Serializable]
public abstract class BusMessage
{
[DataMember(Name = "uid")]
public string Id { get; set; }
}
GetKnownTypes 返回 BusMessage 的所有子类型。
如果我从 wsdl 生成客户端,一切正常。类已正确转换和序列化。
当我尝试使用外部的东西(例如来自 Chrome 的 Postman)时会出现问题。
我收到无法实例化抽象类的异常。
我注意到在从我的客户端进行序列化时,字段“__type”被添加到 json 字符串中。
它包含这样的消息类型:BusTextMessage#namespace。
我尝试将其手动添加为另一个字段,但没有帮助。如何解决这样的问题?
我不应该使用抽象类/接口作为参数吗?
【问题讨论】:
-
我不知道你为什么要为你的 DataContracts 提供抽象类。 Abstract 用于高级面向对象设计,独立于面向服务的体系结构。删除“抽象”会有什么问题?我的猜测是 WCF 做了一些黑魔法,并从你的继承类中创建了自己的 BusMessage 非抽象类。
-
当我删除抽象时,它将创建对象 BusMessage,设置此类的所有属性并忽略其他属性,例如 BusTextMessage,如果发送了 BusTextMessage
-
听起来你有其他类继承了 BusMessage。你能发布一个样本吗?如果你有一个单一的、非抽象的、非继承的 DataContract 类会发生什么?这是实现 WCF DataContracts 的典型且最简单的方法。如果你让它发挥作用,你可以慢慢增加复杂性,看看有什么问题。
-
我知道出了什么问题。我刚刚创建了 BusMessageDto,其中包含所有继承类的字段,然后将其转换为我的继承结构。问题是序列化程序没有关于类类型的信息
-
为什么会有问题?根据定义,序列化数据没有类型系统。您可以在数据本身中包含序列化的数据类型,但字符串不知道它包含哪个类。