Sau khi đọc Data Contract Versioning, chúng tôi kết luận rằng đó không thực sự là toàn bộ câu chuyện. Ví dụ, điều gì sẽ xảy ra nếu bạn đã từng có ValueA, và trong phiên bản mới, nó bây giờ được gọi là ValueB và là một kiểu khác, và bạn cần phải chuyển đổi ValueA thành ValueB?Phiên bản tệp dữ liệu đơn giản với DataContractSerializer
Có một số callbacks Tôi có thể sử dụng để trợ giúp vấn đề này, nhưng không giống như giải pháp duy trì nếu chúng tôi mong định dạng thay đổi thường xuyên trong một khoảng thời gian dài.
Giải pháp mà chúng tôi đã giải quyết là giữ trường "được lưu theo phiên bản" và khi tải tệp, hãy gọi các quy trình chuyển đổi cụ thể cho các phiên bản cũ hơn theo yêu cầu. Những thói quen chuyển đổi này biết cách chuyển đổi XML cho dữ liệu cũ hơn thành XML cho dữ liệu mới hơn.
Tuy nhiên, khi nó quay ra, DataContractSerializes requires the order of the elements to be exactly what it expects. Điều này có nghĩa là quá trình chuyển đổi của chúng tôi phải biết cách chèn các phần tử vào chính xác vị trí chính xác. Điều này khó hơn rất nhiều so với việc thêm một phần tử có tên đã biết, nếu bạn lấy thừa kế vào tài khoản. Với thừa kế, bạn không thể tin cậy hoặc AddAfterSelf
bất kỳ trường nào, đơn giản vì không có trường đơn nào luôn bên cạnh trường mới này.
Bỏ qua một bên những lý do tại sao DataContractSerializer được thực hiện nghiêm ngặt như vậy, bạn có thể đề xuất các cách giải quyết vấn đề này không? Có lẽ một bài viết tuyệt vời về cách duy trì tương thích ngược với các hợp đồng dữ liệu rất cũ, điều đó không trở nên khó sử dụng tại thời điểm bạn thực hiện thay đổi phá vỡ thứ 100 cho định dạng.
Có một số nguyên tắc bổ sung trong this article, nhưng điều này phải được viết cho một mục đích khác. Có ví dụ không có cách nào chúng ta có thể để lại các thành viên dữ liệu cũ treo xung quanh mãi mãi (điểm 9). Có vẻ như hầu hết các bài viết như thế được viết từ một giao thức truyền thông, nhưng thay vì lưu trữ dữ liệu trong một tập tin.
Đó là một hợp đồng khá lớn; Tôi thực sự ghét phải sao chép và dán hầu hết nó chỉ để thay đổi một bool "Enabled" thành enum "State" chẳng hạn. Tôi sẽ gắn bó với xử lý trước XML, trong đó, mặc dù các vấn đề được mô tả trong câu hỏi, là _usually_ khá dễ thực hiện. –