【发布时间】:2015-11-12 18:21:03
【问题描述】:
- 以下是 Silverlight 中的已知错误吗?
- 如果是这样,有什么好的解决方法吗?
类层次结构很简单:
在第一个 PCL 上:
namespace ClassLibrary1
{
[DataContract]
public class BaseClass
{
[DataMember]
public string BaseString { get; set; }
}
}
在第二个 PCL 上(当然,引用第一个...)
namespace ClassLibrary2
{
[DataContract]
public class Derived : BaseClass
{
[DataMember]
public string DerivedString { get; set; }
}
}
服务(在 WebApp 上):
namespace SilverlightApplication1.Web
{
[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[KnownType(typeof(Derived))]
public class Service1
{
[OperationContract]
public List<BaseClass> GetSomething()
{
var data = new List<BaseClass>();
data.Add(new Derived());
return data;
}
}
}
现在, 服务引用不会将 ServiceKnownType 属性添加到 reference.cs 文件。以及由此产生的错误:
格式化程序在尝试反序列化消息时抛出异常:尝试反序列化参数时出错:GetQueueItemsResult。 InnerException 消息是'元素'http://schemas.datacontract.org/2004/07/XXX_BASE_CLASS'包含'http://schemas.datacontract.org/2004/07/XXX_DERIVED_CLASS'数据协定的数据。反序列化器不知道映射到该合约的任何类型。将与 'DERIVED_CLASS' 对应的类型添加到已知类型列表中 - 例如,通过使用 KnownTypeAttribute 属性或将其添加到传递给 DataContractSerializer 的已知类型列表中。有关详细信息,请参阅 InnerException。
[更新] 当然,错误是在客户端上抛出的。服务器端返回正确的值,但客户端无法正确解析它们。 Fiddler 说服务器返回了 0 个字节。 但实际上是客户未能反序列化数据。
我需要一些方法来告诉运行时反序列化器如何将 BaseClass 反序列化为实际传输的类型。 [/更新]
【问题讨论】:
标签: c# wcf silverlight datacontractserializer