代码之家  ›  专栏  ›  技术社区  ›  theburningmonk

对旧的复杂类型使用WCF

  •  1
  • theburningmonk  · 技术社区  · 16 年前

    我正在编写一个WCF服务来替换当前的Web服务,并且我在处理一个需要返回的遗留复杂类型时遇到了问题。

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

    每当我的客户机调用WCF服务时,它会收到一个通信异常,当我打开WCF跟踪时,我发现以下序列化错误:

    键入“common.permission.applicationgroup”(数据协定名称) 应用程序组 : http://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;
    

    最后,应用程序组:

    [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有什么建议吗?

    2 回复  |  直到 16 年前
        1
  •  3
  •   Andrew Hare    16 年前

    尝试将这些添加到数据合同的顶部:

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

    [编辑]如果不进行测试,我无法告诉您这是否会起作用-我想知道DataContractSerializer是否能够序列化您的旧类型,因为DataContractSerializer要求类型“opt-in”(具有类型上的属性)和所有需要序列化的成员。

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

        2
  •  1
  •   Tad Donaghe    16 年前

    我认为安德鲁是对的。

    另见“第3章” Programming WCF Services “作者Juval Lowy。它包含了大量关于数据合同的信息,我确信它完全涵盖了您在这里所要求的内容。

    推荐文章