如何序列化集合以使用 WCF 发送它?

Posted

技术标签:

【中文标题】如何序列化集合以使用 WCF 发送它?【英文标题】:How can I serialize a Collection to send it using WCF? 【发布时间】:2020-12-10 20:11:05 【问题描述】:

我正在尝试通过 WCF 发送一个对象作为此方法中的参数:

[OperationContract]
bool SendProject(Project project);

如果我尝试从客户端调用它,我会得到这个:

尝试序列化参数项目时出错。 InnerException 消息是 'Type 'System.Collections.ObjectModel.Collection`1[[System.Collections.DictionaryEntry, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]' 不应使用数据合约名称 'ArrayOfDictionaryEntry:http://schemas.datacontract.org/2004/07/System.Collections'。考虑使用 DataContractResolver 或将任何静态未知的类型添加到已知类型列表中 - 例如, 通过使用 KnownTypeAttribute 属性或将它们添加到传递给 DataContractSerializer 的已知类型列表中。 有关详细信息,请参阅 InnerException。

我搜索了一些信息,我认为错误是我如何序列化“项目”类中的类(来自Dr. WPF 的类):

#region ISerializable

public virtual void GetObjectData(SerializationInfo info, StreamingContext context)

    if (info == null)
    
        throw new ArgumentNullException("info");
    
            
    Collection<DictionaryEntry> entries = new Collection<DictionaryEntry>();
    foreach (DictionaryEntry entry in _keyedEntryCollection)
        entries.Add(entry);
    info.AddValue("entries", entries);


#endregion ISerializable

问题是我不知道在哪里放置标签“KnownType”或如何正确序列化此字典以使用 WCF 将其作为参数发送。

谢谢!

【问题讨论】:

问题是DictionaryEntry 是非泛型的,因此 WCF 不会知道键和值的约定。但是你为什么要使用 .Net 1.1 中的非通用字典呢?为什么不使用类型化模型? WCF 旨在与类型化模型一起使用。或者,如果你不能使用类型化模型,你能分享一个重现问题的minimal reproducible example 吗?目前您只是共享一个不能独立编译的代码片段。 我更改了 KeyValuePair 的 DictionaryEntry,但错误仍然存​​在,但这次使用 KeyValuePair 作为参数。字典被多次使用,并且没有定义类型,它是 。由于代码具有复杂性,因此很难发送一个最小的可重现示例,但我认为您可以从 Dr.WPF 链接下载代码并在自定义类中的 WCF 中使用它来重现它。如果此解决方案不起作用,我将尝试简化代码。感谢您的帮助! 既然你只是序列化一个Collection&lt;DictionaryEntry&gt;(或Collection&lt;KeyValuePair&lt;string, something you haven't shown us&gt;&gt;),也许你可以用一个存储在根对象中的简单Dictionary&lt;TKey, TValue&gt;来重现它? 【参考方案1】:

我有解决方案,它不是那么干净,但是是一个解决方案。 正如dbc 所说,将DictionaryEntry 更新为KeyValuePair&lt;TKey,TValue&gt; 是推荐的步骤,但解决我的问题的是在序列化所在的类中设置[KnownType(typeof(Collection&lt;KeyValuePair&lt;TypeX, TypeY&gt;&gt;))]

【讨论】:

以上是关于如何序列化集合以使用 WCF 发送它?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 WCF 流传输 MemoryStream

序列化时未获取 xml 输入值以列出 wcf 服务中的类

在反序列化时使用动态和强制执行 WCF 合同

序列化 FileStream 以进行传输

如何自定义 WCF XML 序列化

如何使用 WCF 将派生类型序列化为其基类型