将WCF与传统复杂类型一起使用

时间:2009-02-19 18:50:53

标签: c# wcf serialization

我正在编写一个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的任何建议?

2 个答案:

答案 0 :(得分:3)

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

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

[编辑]没有测试我不能告诉你这是否会起作用 - 我想知道DataContractSerializer是否能够序列化您的遗留类型,因为DataContractSerializer要求类型“选择加入”类型和属性所有需要序列化的成员。

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

答案 1 :(得分:1)

我认为安德鲁是正确的。

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