0

我正在修补 WCF 和 MemoryCache。目标是在 Windows 服务中托管 WCF,以便不同的客户端可以访问此缓存。

第一部分,设置主机工作正常,我可以通过单独的客户端应用程序写入和读取缓存。至少,当尝试将非常简单的对象放入缓存中时,例如字符串或值类型(例如 int)。

当我尝试一个“自定义”对象时,即使它只有一个字符串属性,事情也会开始出错:

There was an error while trying to serialize parameter http://tempuri.org/:value. 

TheInnerException message was 'Type 'Solution.MyType' with data contract name 
'MyType:http://schemas.datacontract.org/2004/07/MyType' is not expected. 
Consider using a DataContractResolver or add any types not known statically to the list    
of known types 
- for example, by using the KnownTypeAttribute attribute or by 
adding them to the list of known types passed to DataContractSerializer.'.
Please see   InnerException for more details.

现在经过一番搜索,我发现我可能不得不用 KnownType 属性来装饰我的类型,但可惜没有成功。我还尝试使用 DataContract 和 DataMember 属性来装饰它,但也没有 sigar。

现在做什么?WCF DataContractResolver 不应该为我完成这项工作吗?我很难相信我必须为我想要序列化的每个类编写一个自定义 DataContractResolver。DataContract 和 DataMember 属性还有什么用途?

我在这里想念什么?另请注意,MyType 不会从另一个类(保存对象)继承。

4

3 回答 3

0

你试过用 Serizlizable 标记标记 MyType 吗?查看 MSDN 库中的“设计服务合同”,了解如何正确创建服务。另外,从服务和实现类中发布一些代码。

于 2012-07-10T13:46:59.897 回答
0

我想你需要处理 WCF 最有趣的部分之一是 KnownType,看看这里:http: //msdn.microsoft.com/en-us/library/ms730167.aspx,基本上你需要指定需要序列化的每个“子”类型的KnownTypeAttribute,即使它们被标记为可序列化。

于 2012-07-10T13:52:37.873 回答
0

我通过实现一些自定义序列化解决了这个问题:

string result = string.Empty;
        Encoding encoding = Encoding.UTF8;
        DataContractSerializer ser = new DataContractSerializer(typeof(MyType));
        MemoryStream stream = new MemoryStream();
        using (XmlDictionaryWriter writer = XmlDictionaryWriter.CreateTextWriter(stream, encoding, true))
        {
            ser.WriteObject(writer, principal);
            writer.Flush();
            result = encoding.GetString(stream.ToArray());
        }

这足以满足我的目的。

于 2012-07-10T14:21:46.983 回答