我有以下示例wcf服务(使用webHttpBinding):
[ServiceContract]
public class Animals {
[OperationContract]
[WebGet(UriTemplate = "/{id}")]
[ServiceKnownType(typeof(Dog))]
public Animal GetAnimalById(string id) {
switch (id) {
case "1": return new Animal { Id = 1 };
case "2": return new Dog { Id = 2 };
}
throw new ArgumentException();
}
}
类型定义如下:
[DataContract]
[KnownType(typeof(Dog))]
public class Animal {
[DataMember]
public int Id { get; set; }
}
public class Dog : Animal {
[DataMember]
public string Name { get; set; }
}
当提供1时,从服务中恢复的xml是(为简洁起见,省略了xmlns):
<Animal><Id>1</Id><Name i:nil="true"/></Animal>
当提供2时:
<Dog><Id>2</Id><Name i:nil="true"/></Dog>
这里是一个问题: Why can't DataContractSerializer constructed for Animal deserialize second xml? 它会抛出类似于:期望元素'Animal'来自命名空间'bla bla' ..遇到'Element',名称为'Dog',名称空间'bla bla' .
附加信息:
1.如果我构造DataContractSerializer提供typeof(Dog)作为参数,它显然是有效的 .
2.如果我构造DataContractSerializer提供typeof(Animal)作为参数(因为我没有't know the type of object I'm即将序列化/反序列化),然后序列化Dog,xml将如下所示:
<Animal i:type="Dog"><Id>0</Id><Name i:nil="true"/></Animal>
反过来可以使用相同的序列化器反序列化而没有任何问题 . 我可以强制WCF使用随基类型提供的DataContractSerializer序列化而不是派生(这似乎更合理,并且可能默认应该在那里)?
2 回答
使用服务的 interface 上的ServiceKnownType代替Animal类 .
因为WCF传递的是结构化XML数据,而不是类型 . WCF不是面向对象的 . 见http://msdn.microsoft.com/en-us/library/ms751512.aspx
您可以根据需要使用http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx,也可以创建自定义的_2574482 .