5

나는 마이크로 소프트의 Best Practices: Data Contract Versioning을 읽고 있었다, 그들은 주 : DataContractSerializer : 멤버를 삭제하지 않는 이유는 무엇입니까?

속성이 이전 버전에서 거짓의 기본 속성에서 왼쪽 된 애드 팍 경우에도 이후 버전에서 데이터 멤버를 제거하지 마십시오.

누구나 이유를 제안 할 수 있습니까? 그들은 정교하지 않습니다. 데이터 멤버를 이후 버전에 추가하는 것이 좋다고 말하기 때문에 제거가 너무 효율적이라고 생각합니다. 이전 버전에서는이를 추가로 볼 수 있습니다.

차이점은 내가 DataMemberAttribute의 Order 속성을 사용하여 끝에 새 멤버를 추가해야한다는 것입니다. 반면에 제거되는 속성은 아마도 마지막에 없을 것입니다. 그러나 누락 된 회원은로드하는 동안 기본값으로 남게되므로 누락 된 회원은 문제가 없다고 분명히 말합니다.

무엇이 누락 되었습니까? 내 제품의 기능을 폐기하고 함께 간 [DataMember] 속성을 제거하면 어떤 버전 - interop 문제 (전방 호환성 및 이전 버전 호환성 모두)가 발생합니까?

또한 이전 버전과의 호환성에 관심이 없다고 결정한 경우 (예 : 이전 버전이 새로운 파일을 열지 않는다고 생각하는 경우) 그런 문제가 계속 적용됩니까?

답변

2

단순히 외부 서비스 사용자가 일부 사용자를 제거하기 전에 만들어진 해당 데이터를 제공/사용할 수 있기 때문입니다. 서비스 메소드 서명을 변경 한 경우 알 수없는 데이터 멤버로 인해 DataContractSerializer은 더 이상 DataContract을 인식하지 못합니다. 서비스 소비자 알려진 모든 경우

그래서, 당신은 쉽게로 자신에 의지 한을 데이터 멤버를 조작 할 수 있습니다 :

  • 소비자를 끊거나
  • 를 적절하게 변경
  • 의를 알려하지 않는다
2

직렬화/직렬화 중에 끊어지지 않더라도 데이터를 버려서 호출자에게 데이터를 성공적으로 왕복 할 수 없다는 것이 하나의 문제입니다. 즉 간단한 방법 제공 : 호출자가 추가 속성을 당신에게 이전 객체를 전달하는 경우

public SomeType Echo(SomeType obj) { 
    return obj; 
} 

을, 그들은 다시 그 값을 할 수 있습니다. extension data API를 사용하여이 기능을 (별도로) 사용할 수 있지만 솔직히이 기능을 사용하는 사람은 거의 없습니다.

관련 문제