Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何序列化集合以使用WCF发送它?_C#_Wcf_Serialization - Fatal编程技术网

C# 如何序列化集合以使用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

我正在尝试通过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:”。考虑使用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