阅读了MSDN参考后,我仍然有疑问何时使用newtype属性。我了解该属性将类型信息传达给序列化器,但是什么时候需要?当被序列化的类具有基类类型的引用时,是否合适,并且可以将这些参考设置为这些引线类型?

此外,是否有过度使用该属性的缺点?例如,在上一个示例中,如果序列化类被标记为Newtype(Baseclass),即使对该类型有明确的引用?

有帮助吗?

解决方案

[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“继承”。

你把它倒了; NewyTypeatTribute应用于基类,并将所有可能通过作为对基地的引用的派生类命名。

例如:

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

当您序列化非混凝土类型(例如接口或基类)时,Newtype属性是必要的。 WCF序列化器必须了解接口或继承类的所有可能实现。它不知道的任何实现都会导致序列化异常。

可以找到一种可能的用法 所以问题

对于以下情况,它也很有用:

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

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

  // rest of the code
}

现在假设值包含其他班级说的人的某些对象。然后所有这些都可以添加nowtype(typeof(perse))

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top