2010-08-23 28 views
6

Tôi có một C class # đó là serialized vào đĩa bởi BinaryFormatter, chẳng hạn như ví dụ sau:Làm thế nào để cấu trúc lại một lớp được tuần tự hóa trong .NET?

// Version 3.0 
[Serializable] 
public class Person 
{ 
    public string FullName; 

    [OptionalField(VersionAdded=2)] 
    public string NickName; 
    [OptionalField(VersionAdded=2)] 
    public DateTime BirthDate; 

    [OptionalField(VersionAdded=3)] 
    public int Weight; 
} 

Sau đó, tôi muốn Refactor lớp này bằng một hoặc nhiều các
sau - Thay đổi tên của nó
- Thay đổi không gian tên của nó
- Di chuyển đến lắp ráp khác

theo như tôi có thể nói, các tập tin nhị phân chỉ có thể bỏ đăng nếu một lớp với cùng tên, namespace và lắp ráp tên chính xác là có sẵn.

Làm cách nào để giải quyết vấn đề này?
Có thể ánh xạ de-serialization đến một tên lớp khác, không gian tên và lắp ráp mà không vi phạm Version Tolerant Serialization?

Trả lời

5

Sau khi một số nghiên cứu tôi nhận ra rằng BinaryFormatter hỗ trợ mọi thứ tôi đang tìm kiếm.

Một BinaryFormatter có thể sử dụng những người đại diện để

  1. Cung cấp khả năng serialize một kiểu đó không được thiết kế ban đầu để được đăng.
  2. Cung cấp cách ánh xạ một phiên bản loại này sang phiên bản loại khác.

Người ta cũng có thể lập bản đồ deserialization từ loại A đến loại B (tên lớp khác nhau, không gian tên và/hoặc tên lắp ráp) bằng cách sử dụng SerializationBinder. Theo như tôi có thể nói, điều này giúp cho các lớp tái cấu trúc được tuần tự hóa và duy trì khả năng tương thích ngược khi thực hiện các thay đổi đột phá không được hỗ trợ bởi việc phiên bản một mình. Điều này có thể được thực hiện một cách nhanh chóng.

tham khảo: http://www.diranieh.com/NETSerialization/BinarySerialization.htm

Edit: Trên một mặt lưu ý, lĩnh vực refactoring (tên hoặc gõ) vẫn là một nỗi đau, như đã thảo luận trong Renaming fields then deserializing in C#. Tôi hiện đang xem xét protobuf-net để giải quyết tốt hơn điều này trong tương lai.

1

Bạn có thể triển khai giao diện ISerializable và ghi đè GetObjectData để cung cấp quá trình deserialization của riêng bạn. Tôi đã không cố gắng, nhưng bạn sẽ có thể deserialize đối tượng cũ của bạn "bằng tay".

+0

Vì vậy, bạn có nghĩa là Người nên triển khai ISerializable và GetObjectData()? Làm thế nào sẽ de-serializer biết rằng lớp người này chính xác nên được sử dụng, khi nó có một tên khác nhau, không gian tên và/hoặc lắp ráp? Tôi có thể nói bằng cách nào đó nói với de-serializer mà lớp học để sử dụng? – angularsen

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