【问题标题】:using WCF with legacy complex types将 WCF 与旧的复杂类型一起使用
【发布时间】:2009-02-19 18:50:52
【问题描述】:

我正在编写 WCF 服务来替换当前的 Web 服务,但我遇到了需要返回的旧复杂类型之一的问题。

不幸的是,我无法触摸任何代码,但查看它们所有类都是可序列化的,并且当前的 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;

最后是应用程序组:

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

【问题讨论】:

    标签: c# wcf serialization


    【解决方案1】:

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

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

    [编辑] 如果没有测试,我无法告诉您这是否可以解决问题 - 我想知道 DataContractSerializer 是否能够序列化您的旧类型,因为 DataContractSerializer 要求类型“选择加入”具有类型和属性所有需要序列化的成员。

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

    【讨论】:

      【解决方案2】:

      我认为安德鲁是正确的。

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

      【讨论】:

      • 感谢您的指点,我刚刚在 sarfaribooksonline 上拿到了 Juval Lowy 的书(甚至是第 2 版!),将查看第 3 章并更熟悉数据合同要求在 WCF 中
      • 这是迄今为止我见过的最好的 WCF 参考资料。
      猜你喜欢
      • 2018-10-24
      • 1970-01-01
      • 2010-12-06
      • 2013-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-30
      相关资源
      最近更新 更多