首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将WCF与遗留复杂类型一起使用

将WCF与遗留复杂类型一起使用
EN

Stack Overflow用户
提问于 2009-02-19 18:50:52
回答 2查看 1.3K关注 0票数 1

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

不幸的是,我不能接触任何代码,但是看看它们,所有的类都是可序列化的,当前的web服务使用它没有问题。

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

输入数据契约名为'ApplicationGrouphttp://schemas.datacontract.org/2004/07/Common.Permission‘的'Common.Permission.ApplicationGroup’是不需要的。向已知类型列表中添加任何静态不知道的类型--例如,使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中。

我想返回的类型是ApplicationPrincipal,但它似乎是在子类型上掉下来的。以下是这些类的外观:

我想返回的类型:

代码语言:javascript
复制
[Serializable]
[TypeConverter(typeof(ExpandableObjectConverter))]
public class ApplicationPrincipal : 
    IPrincipal, ISupportInitialize, IDeserializationCallback, IFormattable
{
    private ApplicationIdentity m_identity;
    private ApplicationGroupCollection m_groups;
    private ConditionDictionary m_roleConditions;

下面是ApplicationGroupCollection:

代码语言:javascript
复制
[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:

代码语言:javascript
复制
[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有任何建议吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-02-19 18:53:12

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

代码语言:javascript
复制
[KnownType(typeof(ApplicationGroupCollection))]
[KnownType(typeof(ApplicationGroup))]

在不进行测试的情况下,我无法告诉您这样做是否有用--我想知道DataContractSerializer是否能够序列化您的遗留类型,因为DataContractSerializer要求类型上有属性的类型"opt-in“和所有需要序列化的成员。

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

票数 3
EN

Stack Overflow用户

发布于 2009-02-19 19:04:01

我认为安德鲁是对的。

另外,请参阅朱瓦尔·洛伊的"WCF服务的编程“第三章。它包含了关于DataContracts的广泛信息,我确信它完全涵盖了您在这里要求的内容。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/566639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档