2013-03-26 40 views
11

Nếu tôi muốn sắp xếp một đối tượng, tôi phải sử dụng thuộc tính [Serializable] và tất cả biến thành viên sẽ được ghi vào tệp. Những gì tôi không biết cách làm phiên bản, ví dụ: nếu tôi thêm biến thành viên mới (đổi tên biến hoặc chỉ xóa biến) và sau đó tôi mở (deserialize) tệp, làm thế nào tôi có thể xác định phiên bản tệp/đối tượng để tôi có thể đặt thành viên mới hoặc di chuyển kiểu nào đó? Làm thế nào tôi có thể xác định rằng biến được khởi tạo trong quá trình tải hay không (bỏ qua bởi deserializer).Nối tiếp và phiên bản đối tượng trong C#

Tôi biết rằng có các phương pháp tiếp cận khoan dung phiên bản và tôi có thể đánh dấu các biến có thuộc tính [OptionalField(VersionAdded = 1)]. Nếu tôi mở một tệp cũ, khung công tác sẽ bỏ qua tùy chọn này (biến mới) và nó sẽ chỉ bằng 0/null. Nhưng một lần nữa làm thế nào tôi có thể xác định nếu biến được khởi tạo bởi tải hoặc nó đã bị bỏ qua.

Tôi có thể viết số phiên bản lớp/đối tượng vào luồng. Sử dụng phương thức ISerializable và trong phương thức constructor(SerializationInfo oInfo, StreamingContext context) đọc số phiên bản này. Điều này sẽ cho tôi biết chính xác phiên bản lớp trong luồng là gì.

Tuy nhiên tôi dự kiến ​​rằng loại phiên bản như vậy đã được triển khai bởi khung công tác phát trực tuyến trong C#. Tôi đã cố gắng để có được phiên bản lắp ráp từ SerializationInfo nhưng nó luôn luôn được thiết lập để phiên bản hiện tại không phải phiên bản được sử dụng khi đối tượng đã được lưu.

Cách tiếp cận ưa thích là gì? Tôi thấy rất nhiều bài viết trên mạng, nhưng tôi không thể tìm thấy một giải pháp tốt cho việc này đề cập đến phiên bản ...

Any help is appreciated Cảm ơn, Abyss

Trả lời

2

tha thứ cho tôi nếu một số những gì tôi viết quá rõ ràng,

Trước hết, vui lòng! bạn phải ngừng suy nghĩ rằng bạn đang sắp xếp một đối tượng ... Điều đó đơn giản là không chính xác vì các phương thức là một phần của đối tượng của bạn không được duy trì. Bạn đang lưu giữ thông tin - và như vậy .. DỮ LIỆU chỉ.

Nối tiếp .NET cũng tuần tự hóa tên kiểu đối tượng chứa tên lắp ráp và phiên bản của nó, vì vậy khi bạn deserialize - nó so sánh thông tin lắp ráp liên tục với loại sẽ được hiển thị với thông tin - nếu chúng không cùng nó sẽ trả về một ngoại lệ.

Bên cạnh vấn đề phiên bản - không phải mọi thứ đều có thể được tuần tự hóa dễ dàng .. cố gắng sắp xếp theo kiểu System.Drawing.Color và bạn sẽ bắt đầu hiểu các vấn đề với cơ chế đơn giản hóa của tuần tự hóa .NET.

Trừ khi bạn lên kế hoạch sắp xếp thứ gì đó thực sự đơn giản mà không có kế hoạch phát triển, tôi sẽ không sử dụng cơ chế tuần tự do .NET cung cấp.

Lấy tiêu điểm trở lại câu hỏi của bạn, bạn có thể đọc ở đây về khả năng vô hiệu hóa phiên bản: http://msdn.microsoft.com/en-us/library/ms229752(v=vs.80).aspx được cung cấp cho BinaryFormatter. Bạn cũng nên kiểm tra XML Serialization có một số khả năng tốt đẹp, nhưng lợi ích lớn nhất là bạn nhận được một XML mà con người có thể đọc được vì vậy dữ liệu của bạn sẽ không bao giờ bị mất ngay cả khi bạn gặp rắc rối với việc phiên bản các loại của bạn.

Nhưng cuối cùng, tôi khuyên bạn nên sử dụng Cơ sở dữ liệu với Khuôn khổ thực thể để duy trì dữ liệu của bạn hoặc viết trình quản lý tệp phẳng của riêng bạn.trong khi EF là rất tốt cho hầu hết các giải pháp, đôi khi bạn có thể muốn một cái gì đó nhẹ hơn để tồn tại một cái gì đó rất đơn giản. (ngụ ý của tôi là tôi không còn có thể nhìn thấy một giải pháp nơi serialization .NET có thể có liên quan.)

Tôi hy vọng điều này sẽ giúp, Chúc may mắn.

+1

+1 để đề xuất sử dụng phương pháp khác với serialization .NET. – Theraot

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