5

tôi đã đọc của Microsoft Best Practices: Data Contract Versioning, và họ tuyên bố:DataContractSerializer: tại sao không xóa thành viên?

Không tháo các thành viên dữ liệu trong các phiên bản sau, ngay cả khi isRequired tài sản còn lại tại khách sạn mặc định của sai trong các phiên bản trước.

Có ai đề xuất bất kỳ lý do nào cho điều này không? Họ không xây dựng. Vì họ nói rằng nó tốt để thêm các thành viên dữ liệu trong một phiên bản sau này, có vẻ như việc loại bỏ cũng sẽ ổn - một cách hiệu quả, phiên bản cũ sẽ thấy nó như là một add.

Sự khác biệt, tôi giả sử, là bạn phải thêm thành viên mới vào cuối (sử dụng thuộc tính Order trên DataMemberAttribute), trong khi tài sản bị loại bỏ có thể sẽ không ở cuối. Nhưng họ cũng nói rằng các thành viên còn thiếu sẽ bị bỏ lại ở giá trị mặc định của họ trong quá trình tải, vì vậy rõ ràng là các thành viên bị thiếu là OK.

Tôi đang thiếu gì? Tôi sẽ gây ra vấn đề gì về phiên bản interop (cả khả năng tương thích về phía trước và tương thích ngược) nếu tôi đã lỗi thời một tính năng của sản phẩm và xóa thuộc tính [DataMember] đi kèm với nó?

Ngoài ra, nếu tôi quyết định rằng tôi không quan tâm đến tính tương thích về phía trước (tức là, nếu tôi không quan tâm đến các phiên bản cũ hơn đang mở các tệp mới hơn), sẽ có bất kỳ vấn đề nào vẫn được áp dụng không?

Trả lời

2

Đơn giản vì người tiêu dùng dịch vụ bên ngoài có thể cung cấp/sử dụng dữ liệu đó (chúng được tạo trước khi bạn xóa một số thành viên). Trong trường hợp bạn đã thay đổi chữ ký phương thức dịch vụ, DataContractSerializer sẽ không thể nhận dạng được DataContract nữa, vì các thành viên dữ liệu không xác định.

Vì vậy, nếu người tiêu dùng dịch vụ của bạn đều biết, bạn có thể dễ dàng thao tác dữ liệu thành viên tại của riêng bạn sẽ càng lâu càng quý vị:

  • không phá vỡ hoặc tiêu dùng
  • đúng thông báo cho họ về sự thay đổi
2

Một vấn đề là ngay cả khi nó không bị hỏng trong quá trình tuần tự hóa/deserialization, bạn có thể vứt bỏ dữ liệu - nghĩa là bạn không thể chuyển dữ liệu khứ hồi thành công trở lại người gọi. tức là được đưa ra phương pháp đơn giản:

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

Nếu người gọi đang chuyển cho bạn đối tượng cũ với thuộc tính bổ sung, họ có thể muốn giá trị đó trở lại. Bạn có thể kích hoạt tính năng này (riêng) với API extension data, nhưng thật lòng mọi người hiếm khi bận tâm với điều này.