WCF中的原始SOAP合同(我出于可读性而故意省略了DTO属性):
public class A : B
{
public int Field1 {get;set;}
public int Field2 {get;set;}
}
public abstract class B
{
public int Field3 {get;set;}
}
一段时间后,原始合同交给了客户,他们使用了它。大家开心。但是后来我决定将一个字段移到抽象级别:
public class A : B
{
public int Field2 {get;set;}
}
public abstract class B
{
public int Field1 {get;set;}//heh, become abstract
public int Field3 {get;set;}
}
因此,基本上,只要将此字段添加到每个具体类中,都是一样的,而对于A不变,但这会破坏旧客户端。
为什么会这样?如何在SOAP中实现REST灵活性,您可以在其中添加字段/将字段从具体类移动到抽象,然后一切正常?
答案 0 :(得分:0)
wcf以正确的顺序序列化和反序列化数据。 顺序是抽象类的第一属性,然后是子类的属性。 因此,原始DataContact的顺序为Field3-> 1,Field1-> 2,Field2-> 3。
然后将Field1移至抽象类,因此顺序为Field1-> 1,Field3-> 2,Field2-> 3。
更改后,客户端和服务器端的属性顺序不匹配。因此,您应该更改抽象类的顺序。
[DataContract]
public abstract class Parent
{
// IsRequired is used to test whether has received the property
// if not, it will show error. Order could change the order of the property in message
[DataMember(IsRequired = true,Order =1)]
public int Field3 { get; set; }
[DataMember(IsRequired = true,Order =2)]
public int Field1 { get; set; }
}
我知道这种方式仅适用于较小的更改,如果您想进行大量更改,请考虑使用DataContractSurrogate https://docs.microsoft.com/en-us/dotnet/framework/wcf/extending/data-contract-surrogates