C# 如何序列化集合以使用WCF发送它?
我正在尝试通过WCF将对象作为此方法中的参数发送:C# 如何序列化集合以使用WCF发送它?,c#,wcf,serialization,C#,Wcf,Serialization,我正在尝试通过WCF将对象作为此方法中的参数发送: [OperationContract] bool SendProject(Project project); 如果我试着从客户那里打电话,我会得到这个: 尝试序列化参数项目时出错。InnerException消息为'Type'System.Collections.ObjectModel.Collection'1[[System.Collections.DictionaryEntry,mscorlib,Version=4.0.0.0,Cultu
[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:”。考虑使用DATACONTRORTCORDEVER或将未知类型的任何类型添加到已知类型的列表中,例如,
通过使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中。“。
有关更多详细信息,请参阅InnerException
我搜索了一些信息,我认为错误在于如何序列化“project”类中的类(来自的类):
#区域ISerializable
公共虚拟void GetObjectData(SerializationInfo信息、StreamingContext上下文)
{
if(info==null)
{
抛出新的ArgumentNullException(“信息”);
}
集合条目=新集合();
foreach(字典在_keyedEntryCollection中输入条目)
条目。添加(条目);
信息添加值(“条目”,条目);
}
#端域ISerializable
问题是,我不知道将标记“KnownType”放在哪里,也不知道如何正确序列化此字典,以便使用WCF将其作为参数发送
谢谢 我有一种溶液,它不是很干净,但却是一种溶液。
如前所述,建议将
DictionaryEntry
更新为KeyValuePair
,但解决我问题的方法是在序列化所在的类中设置[KnownType(typeof(Collection))]
。问题是非泛型,因此WCF将不知道密钥和值的约定。但是为什么要使用.NET1.1中的非通用词典呢?为什么不使用类型化模型?WCF设计用于处理类型化模型。或者,如果不能使用类型化模型,是否可以共享一个复制问题的模型?目前,您只共享一个不独立编译的代码片段。我更改了KeyValuePair的DictionaryEntry,但错误仍然存在,但这次使用KeyValuePair作为参数。字典被多次使用,但没有定义类型,它是或。很难发送一个最小的可复制示例,因为代码很复杂,但我认为您可以通过从Dr.WPF链接加载代码并在自定义类的WCF中使用它来复制它。如果这个解决方案不起作用,我将尝试简化代码。谢谢你的帮助!因为您只是序列化集合
(或集合)
#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