这就是我想要做的。这应该(理论上)非常简单。
假设我有一个带有以下代码的WCF服务(裸机功能):
<DataContract()>
Public Class BaseObj
<DataMember()>
Public ID As Integer
End Class
<DataContract()>
Public Class TestObj1
Inherits BaseObj
Public Sub New(ByVal idval As Integer)
ID = idval
End Sub
End Class
<DataContract()>
Public Class TestObj2
Inherits BaseObj
Public Sub New(ByVal idval As Integer)
ID = idval
End Sub
<DataMember()>
Public DoNotShow As String = "fail"
End Class
以下是我想写的代码:
<WebInvoke(Method:="GET", ResponseFormat:=WebMessageFormat.Json, UriTemplate:="Test?reqReportID={reqReportID}")>
Public Function GetCollection(ByVal reqReportID As Integer) As List(Of BaseObj)
Dim myObjs as New List(Of BaseObj)
myObjs.add(new TestObj1(1))
myObjs.add(new TestObj2(2))
return myObjs
End Function
我希望JSON响应看起来完全像这样:[{"ID":1},{"ID":2}]
现在我的代码返回一个空响应(没有抛出错误,没有传递信息)。我可以通过这样做来让它返回某些东西:
<DataContract(), KnownType(GetType(TestObj1)), KnownType(GetType(TestObj2))>
Public Class BaseObj
<DataMember()>
Public ID As Integer
End Class
然而,响应为JSON对象添加了一个“__type”,并且还向JSON对象添加了“DoNotShow”(不是一件好事)。
这里的问题是我不希望传递每个对象唯一的信息。我只想通过基类获取每个对象共有的信息。我所做的一切都不会改变它,除非我遗漏了某些东西,否则WCF的作者在创建它时似乎对OO编程有很好的视角。
您在SO的任何见解都可能会非常感激。
答案 0 :(得分:0)
出于好奇,为什么重要?通过你给出的例子,我不确定我是否遵循它为什么重要。
我最喜欢的一个选项是从TestObj1继承TestObj2。然后我将取消知识类型(gettype(testobj2))。
如果要动态添加已知类型,则应自行调用datacontractjsonserializer。
编辑:这将导致客户端的两个TestObj1对象。不确定你是否想要这种行为。
答案 1 :(得分:0)
如果您的集合只输入BaseObj,我认为序列化程序不可能生成您正在寻找的JSON。
如果只是简单地生成[{"ID":1},{"ID":2}]
,则收件人无法区分这些类型。另一端如何确定第一个对象是TestObj1类型但第二个对象是TestObj2类型?