我正在编写一个WCF服务来替换当前的web服务,而且我在需要返回的遗留复杂类型中遇到了问题。
不幸的是,我不能接触任何代码,但是看看它们,所有的类都是可序列化的,当前的web服务使用它没有问题。
每当我的客户端调用WCF服务时,它就会得到一个通信异常,当我打开WCF的跟踪时,我发现了一个序列化错误:
输入数据契约名为'ApplicationGrouphttp://schemas.datacontract.org/2004/07/Common.Permission‘的'Common.Permission.ApplicationGroup’是不需要的。向已知类型列表中添加任何静态不知道的类型--例如,使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中。
我想返回的类型是ApplicationPrincipal,但它似乎是在子类型上掉下来的。以下是这些类的外观:
我想返回的类型:
[Serializable]
[TypeConverter(typeof(ExpandableObjectConverter))]
public class ApplicationPrincipal :
IPrincipal, ISupportInitialize, IDeserializationCallback, IFormattable
{
private ApplicationIdentity m_identity;
private ApplicationGroupCollection m_groups;
private ConditionDictionary m_roleConditions;下面是ApplicationGroupCollection:
[Serializable]
public class ApplicationGroupCollection :
IList, IEnumerable, IFormattable, ISupportInitialize,
IDeserializationCallback, ICloneable, ICustomTypeDescriptor
{
/// <summary>
/// Occurs when a value is being changed in the collection.
/// </summary>
[field:NonSerialized]
public event CollectionChangeEventHandler CollectionChanging;
/// <summary>
/// Occurs when a value has been changed in the collection.
/// </summary>
[field:NonSerialized]
public event CollectionChangeEventHandler CollectionChanged;最后,ApplicationGroup:
[Serializable]
[TypeConverter(typeof(ExpandableObjectConverter))]
public class ApplicationGroup :
ICloneable, ISupportInitialize, IDeserializationCallback, IFormattable
{
private int m_groupID;
private string m_groupName;
private string m_groupDesc;
private ConditionDictionary m_roleConditions;对于为什么WCF不能序列化ApplicationGroup有任何建议吗?
发布于 2009-02-19 18:53:12
尝试将这些添加到DataContract的顶部:
[KnownType(typeof(ApplicationGroupCollection))]
[KnownType(typeof(ApplicationGroup))]在不进行测试的情况下,我无法告诉您这样做是否有用--我想知道DataContractSerializer是否能够序列化您的遗留类型,因为DataContractSerializer要求类型上有属性的类型"opt-in“和所有需要序列化的成员。
编辑这里是您看到的第二组错误的原因。如果要从服务返回自定义类型,则客户端需要该类型的副本,以便它可以反序列化消息。这意味着您需要向客户端提供包含遗留类型的程序集的副本,以便客户端引用。
发布于 2009-02-19 19:04:01
我认为安德鲁是对的。
另外,请参阅朱瓦尔·洛伊的"WCF服务的编程“第三章。它包含了关于DataContracts的广泛信息,我确信它完全涵盖了您在这里要求的内容。
https://stackoverflow.com/questions/566639
复制相似问题