2009-02-19 34 views
1

我正在编写一个WCF服务来替换当前的Web服务,并且遇到了需要返回的传统复杂类型之一。与传统复杂类型一起使用WCF

不幸的是,我无法触及任何代码,但看着它们,所有的类都是可序列化的,当前的Web服务正在使用它,没有任何问题。

每当我的客户端调用WCF服务它得到一个通信异常,当我打开跟踪WCF这里的序列化错误,我发现:

类型“Common.Permission.ApplicationGroup”数据合同名称“ApplicationGrouphttp://schemas.datacontract.org/2004/07/Common.Permission'不是预期的。将任何未知的静态类型添加到已知类型列表中 - 例如,使用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?

回答

3

尝试添加这些到您的DataContract的顶部:

[KnownType(typeof(ApplicationGroupCollection))] 
[KnownType(typeof(ApplicationGroup))] 

[编辑]没有测试,我不能告诉你,这是否会做的伎俩 - 我想知道如果DataContractSerializer的就能系列化你的遗产因为DataContractSerializer要求类型“选入”类型的属性以及所有需要序列化的成员。

[编辑]这里是你所看到的第二组错误的原因。如果您从服务返回自定义类型,则客户端需要具有该类型的副本,以便它可以反序列化消息。这意味着您需要将包含旧类型的程序集副本提供给客户端供客户端参考。

1

我认为安德鲁是正确的。

此外,请参阅Juval Lowy的“Programming WCF Services”的第3章。它包含有关DataContracts的大量信息,我很确定它涵盖了您在此提出的所有内容。

+0

感谢您的指点,我刚刚掌握了关于sarfaribooksonline的一本Juval Lowy的书(第2版甚至是!),我们将看看第3章并更熟悉WCF中的数据合同要求 – theburningmonk 2009-02-19 20:05:34