我正在修补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不会从其他类继承(保存对象)。
答案 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());
}
这足以满足我的目的。