使用WCF将对象发送到托管MemoryCache的服务

时间:2012-07-10 13:38:28

标签: .net wcf serialization tcp memorycache

我正在修补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不会从其他类继承(保存对象)。

3 个答案:

答案 0 :(得分:0)

您是否尝试使用Serizlizable标记标记MyType?查看MSDN库中的“Designing Service Contracts”,了解如何正确创建服务。另外,从服务和实现类发布一些代码。

答案 1 :(得分:0)

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

答案 2 :(得分: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());
        }

这足以满足我的目的。