2010-12-04 56 views
3

我正在读reference page哪些类型可由WCF序列化,并且它对哪些类型是自动KnownType不明确,哪些不是。任何人都可以对此有所了解吗?例如,如果我的DataContract有一个Object类型的成员,那么如果我传递一个字符串,它将会很好地序列化,但如果我传递一个Dictionary,则不会。字典将需要一个KnownType,尽管在该页面中被提及为支持。有了这个我有两个问题:找出对象的实例是否是WCF中的DataContract可序列化的

  1. 所以问题是,什么是自动KnowType WCF总是使用?

  2. 我需要的代码将确定如果默认情况下对象的实例是KnownType。一种解决方案是从1的答案中提出一个详尽的列表,然后用“obj is type”语句检查每个对象,但这似乎是一个糟糕的实现。有更聪明的方法吗?

编辑:

reference列出了默认情况下知道的类型。所有原语少于DateTimeOffset加XmlElement。所以只剩下两个:如果一个对象是原始类型,我怎么知道?

编辑2: typeof(obj).IsPrimitive将完成大部分工作!

回答

1

当操作契约签名中只有基类型可见时,需要一个已知类型,但可以返回一些派生类型。例如:

[OperationContract] 
BaseClass Foo(); 

并在实施:

public Foo() 
{ 
    return DerivedClass(); 
} 

其中DerivedClassBaseClass导出。所以,你需要在BaseClass声明中显式指定此两种:

[KnownType(typeof(DerivedClass))] 
[DataContract] 
public class BaseClass { } 

或使用[ServiceKnownType]在服务合同声明:

​​3210

或使用配置文件:

<system.runtime.serialization> 
    <dataContractSerializer> 
     <declaredTypes> 
      <add type="SomeNs.BaseClass, SomeAssembly"> 
       <knownType type="SomeNs.DerivedClass, SomeAssembly"/> 
      </add> 
     </declaredTypes> 
    </dataContractSerializer> 
</system.runtime.serialization> 

更新:

由于文档指出它,你不需要这个基本类型:

内置到 .NET Framework中的下列类型都可以被序列化 ,被认为是原始 类型:字节,为SByte ,Int16,Int32, Int64,UInt16,UInt32,UInt64,Single, Double,Boolean,Char,Decimal, Object和String。

+0

您至少有部分错误。 KnownType也用于其他目的。例如,如果我不为Dictionary 添加KnownType,我会得到序列化异常。你也没有回答我的两个问题:-(我是低调的,但是如果你编辑答案来真正解决我的问题,我会再回来。再一次,我不会问关于KnownType的作用。 – 2010-12-04 19:50:42

相关问题