2009-10-03 32 views
6

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 AddAfterSelfbấ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.

Trả lời

2

Tôi nghĩ bạn đang mong đợi quá nhiều từ hỗ trợ phiên bản được tích hợp sẵn. Nó thực sự có ý định cho phép bạn thêm thành viên mới trong khi giữ lại tất cả các chức năng hiện có và do đó các thành viên.

Trong trường hợp vi phạm các thay đổi đối với hợp đồng, có thể bạn nên tạo phiên bản hợp đồng mới (ví dụ: sử dụng không gian tên mới - quy ước chung là sử dụng hậu tố yyyy/mm, ví dụ: http://mycompany.com/myservices/2009/10).

Sau đó, bạn cần có khả năng hỗ trợ nhiều hợp đồng cũ phù hợp và cần phải chuyển đổi giữa từng hợp đồng được hỗ trợ và bất kỳ đại diện nội bộ hiện tại nào bạn đang sử dụng.

+0

Đó 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. –

4

1 năm sau, tôi phải nói rằng DataContractSerializer đã thực sự hút cho phiên bản. Nó quá cứng nhắc. Nó thực sự có nghĩa là cho các hợp đồng mà không có khả năng thay đổi, và sau đó chỉ theo những cách cụ thể. Bạn phải làm thêm công việc để sử dụng nó chỉ để làm cho nó nhanh chóng - ví dụ như KnownTypeAttribute. Tôi sẽ chỉ khuyên bạn nên nó nếu bạn yêu cầu serialization tương đối nhanh - mà, cho là, là khá quan trọng đối với những gì nó được thiết kế cho.

Một dự án khác mà tôi làm việc trên sử dụng trình nối tiếp linh hoạt hơn, không bỏ qua gọi hàm tạo lớp (đã gây ra nhiều bất tiện) và không yêu cầu các mục theo thứ tự cụ thể. Nó giao dịch một cách duyên dáng với các trường mới (chúng được để lại ở bất kỳ hàm tạo nào được đặt cho chúng) và loại bỏ các trường có sự can thiệp của lập trình viên bằng 0.

Bây giờ, nếu chỉ tôi có thể đăng bài ở đây ... Tuy nhiên, khoảng 5x-10x chậm hơn so với DataContractSerializer.

+0

Cảm ơn bạn đã thực hiện bài đăng này, tôi sắp bắt tay vào cơn ác mộng tương tự như bạn đã trải qua trong năm qua. Tôi gặp khó khăn trong việc tìm kiếm một giải pháp thay thế tốt cho DataContractSerializer, tôi lấy nó rằng Serializer khác của bạn là độc quyền, do đó bạn không thể chia sẻ nó? – Jambobond

+0

@Jambobond Tôi sợ vậy :( –

Các vấn đề liên quan