如何序列化集合以使用 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 吗?目前您只是共享一个不能独立编译的代码片段。
我更改了 KeyValuePairCollection<DictionaryEntry>
(或Collection<KeyValuePair<string, something you haven't shown us>>
),也许你可以用一个存储在根对象中的简单Dictionary<TKey, TValue>
来重现它?
【参考方案1】:
我有解决方案,它不是那么干净,但是是一个解决方案。
正如dbc 所说,将DictionaryEntry
更新为KeyValuePair<TKey,TValue>
是推荐的步骤,但解决我的问题的是在序列化所在的类中设置[KnownType(typeof(Collection<KeyValuePair<TypeX, TypeY>>))]
。
【讨论】:
以上是关于如何序列化集合以使用 WCF 发送它?的主要内容,如果未能解决你的问题,请参考以下文章