这是我想做的。这(理论上)应该很简单。
假设我有一个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编程时似乎对OO编程有了一个非常被动的看法。
如果你对此有任何见解,我将不胜感激。
发布于 2011-04-12 23:13:24
出于好奇,这有什么关系?以你给出的例子,我不确定我是否遵循了为什么它是重要的。
我的一个选择是从TestObj2继承TestObj1。然后,我将去掉已知类型(gettype(Testobj2))。
如果您想动态添加已知类型,那么您应该自己调用datacontractjsonserializer序列化程序。
http://msdn.microsoft.com/en-us/library/system.runtime.serialization.json.datacontractjsonserializer.aspx
编辑:这将在客户端产生两个TestObj1对象。不确定你是否想要那样的行为。
发布于 2011-04-13 04:45:19
如果您的集合只输入到BaseObj,我认为序列化程序不可能生成您正在寻找的JSON。
如果只生成[{"ID":1},{"ID":2}],则收件人无法区分这些类型。另一端如何确定第一个对象的类型是TestObj1,而第二个对象的类型是TestObj2?
https://stackoverflow.com/questions/5641750
复制相似问题