Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.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# 何时使用KnownType属性合适?_C#_Wcf_Known Types - Fatal编程技术网

C# 何时使用KnownType属性合适?

C# 何时使用KnownType属性合适?,c#,wcf,known-types,C#,Wcf,Known Types,在阅读了MSDN参考之后,我仍然对何时使用KnownType属性有疑问。我知道该属性将类型信息传递给序列化程序,但何时需要?当被序列化的类具有基类类型的引用,并且存在可以设置为这些引用的上转换派生类时,是否合适 此外,过度使用该属性是否有任何缺点?例如,在上一个示例中,如果序列化的类被标记为KnownType(baseClass),即使存在对该类型的显式引用?在序列化非具体类型(如接口或基类)时,KnownType属性是必需的。WCF序列化程序必须知道接口或继承类的所有可能实现。它不知道的任何实

在阅读了MSDN参考之后,我仍然对何时使用KnownType属性有疑问。我知道该属性将类型信息传递给序列化程序,但何时需要?当被序列化的类具有基类类型的引用,并且存在可以设置为这些引用的上转换派生类时,是否合适


此外,过度使用该属性是否有任何缺点?例如,在上一个示例中,如果序列化的类被标记为KnownType(baseClass),即使存在对该类型的显式引用?

在序列化非具体类型(如接口或基类)时,KnownType属性是必需的。WCF序列化程序必须知道接口或继承类的所有可能实现。它不知道的任何实现都会导致序列化异常


在这个

[KnownType]
中可以找到一个可能的用法来告诉它关于子类型的信息。不使用它的缺点是以下各项不起作用:

[DataContract]
class Foo {}

[DataContract]
class Bar : Foo {}
使用WCF接口上的方法返回:

public Foo GetFoo() { return new Bar(); }
如果没有该属性,序列化程序(特别是对于mex/代理生成的类型)将不知道
Bar
,并且将失败。使用以下属性:

[DataContract, KnownType(typeof(Bar))]
class Foo {}
它会起作用的。这仅适用于
DataContractSerializer
——使用
NetDataContractSerializer
可以以不同的方式获取类型数据。

如果在模式中使用XSD“继承”

你把它倒过来了;KnownTypeAttribute应用于基类,并命名可能作为对基类的引用传递的所有派生类

例如:

...
[KnownType(typeof(POBoxAddress))]
[KnownType(typeof(StreetAddress))]
[KnownType(typeof(SingleLineAddress))]
[KnownType(typeof(ParsedAddress))]
public abstract class AddressBase
{
    ...
}

它也适用于以下情况:

[DataContract]
[knownType(typeof(Person))]
public class KeyValue
{
  [DataMember]
  public string key {get; set;}

  [DataMember]
  public string value {get; set;}

  // rest of the code
}
现在假设value包含其他类的某个对象,比如Person。然后,要完成这些工作,您必须添加knownType(typeof(Person))