【发布时间】:2014-03-31 14:35:35
【问题描述】:
首先,我希望我提供足够的信息来说明问题,如果没有,请询问更多。
我有一个使用双工通道和 OneWay 方法调用的有效 WCF 通信。 ServiceHost 位于使用 NetPipeBinding 的托管 WPF 应用程序内,客户端位于该应用程序内的 AppDomain 中。只要所有类型都是原始类型(字符串、日期时间、...)或指定为已知类型(List<object>、List<string>),一切都会按预期工作。但我需要发送其他类型,我无法为其添加已知类型属性,因为我在编译时不知道它们。
正如我在此处 (http://msdn.microsoft.com/library/ms731923(v=vs.100).aspx) 所读到的,所有具有公共属性的公共类型都受支持,使用 SerializableAttribute 修饰的类型也是如此。
我尝试转移一个非常简单的类:
public class ADT
{
public string Name { get; set; }
}
第二次尝试
[Serializable]
public class SerializableADT
{
public string Name { get; set; }
}
按照 Herdo 的建议
[DataContract]
public class DataContractADT
{
[DataMember]
public string Name { get; set; }
[DataMember]
public object Value { get; set; }
}
但是所有三种类型的反序列化都失败了。
尝试序列化参数时出错 _http://tempuri.org/:returnValue。 InnerException 消息是“类型 带有数据合同名称的“TestLibraries.SeriablizableADT” 'SeriablizableADT:_http://schemas.datacontract.org/2004/07/TestLibraries' 预计不会。考虑使用 DataContractResolver 或添加任何 已知类型列表中静态未知的类型 - 例如, 通过使用 KnownTypeAttribute 属性或将它们添加到 传递给 DataContractSerializer 的已知类型列表。请参见 InnerException 了解更多详情。
如何在不更改任何编译时间的情况下编组符合 MSDN 规则的任何类型(例如,用 Serializable 装饰)?
【问题讨论】:
-
您是否尝试过
DataContract的SerializeableADT属性? -
是的,我做到了 - 但我得到了同样的错误。我读过只要使用默认的 DataContractSerializer,Serializable 和 DataContract 的行为就相同。我目前正在试验 DataContractResolver 方式(来自异常消息) - 但仍然没有运气。
标签: c# wcf serialization