我正在编写一个WCF服务来替换当前的Web服务,我遇到了一个需要返回的遗留复杂类型的问题。
不幸的是我无法触及任何代码,但查看它们所有类都是Serializable,当前的Web服务正在使用它没有问题。
每当我的客户端调用WCF服务时,它都会收到通信异常,当我打开WCF的跟踪时,我发现了序列化错误:
不期望输入数据合同名称为“ ApplicationGroup :http://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的任何建议?
答案 0 :(得分:3)
尝试将这些添加到DataContract的顶部:
[KnownType(typeof(ApplicationGroupCollection))]
[KnownType(typeof(ApplicationGroup))]
[编辑]没有测试我不能告诉你这是否会起作用 - 我想知道DataContractSerializer是否能够序列化您的遗留类型,因为DataContractSerializer要求类型“选择加入”类型和属性所有需要序列化的成员。
[编辑]以下是您看到的第二组错误的原因。如果从服务返回自定义类型,则客户端需要具有该类型的副本,以便它可以反序列化消息。这意味着您需要向客户端提供包含旧类型的程序集的副本,以供客户端参考。
答案 1 :(得分:1)
我认为安德鲁是正确的。
另请参阅Juval Lowy的第3章“Programming WCF Services”。它包含有关DataContracts的大量信息,我很确定它涵盖了您在这里所要求的内容。