题
阅读了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))
不隶属于 StackOverflow