2015-07-02 12 views
6

Tôi đang cố gắng chuyển đổi từ C sang C# và tôi có một số câu hỏi về cách lưu đối tượng vào các tệp và tuần tự hóa. Trong C nếu bạn muốn lưu cấu trúc dữ liệu, tôi đã được dạy rằng lưu nó ở định dạng văn bản dưới dạng chuỗi thường không cần thiết và tệp nhị phân tồn tại dưới dạng ảnh chụp nhanh thường tốt hơn vì nó không có t cần mã hóa/giải mã và chuỗi phù hợp với các trường. Trong C# cách tiếp cận có vẻ khác, nó chuyển đổi các trường đối tượng riêng biệt thành một chuỗi hoặc một số định dạng khác và sau đó nó xây dựng lại đối tượng khi cần thiết. Tôi không chắc chắn làm thế nào serialization nhị phân hoạt động nhưng tôi nghĩ rằng nó sill chuyển đổi dữ liệu sang một số định dạng và không tồn tại như một ảnh chụp bộ nhớ không định dạng tinh khiết.Lưu các đối tượng/serialization

Tại sao phương pháp "chụp nhanh bộ nhớ" mà không có bất kỳ mã hóa/giải mã nào không được sử dụng trong C#? Lý do duy nhất tôi có thể nghĩ là khả năng tương thích với các mã và môi trường khác, và có lẽ nó phải làm với sự phức tạp của các đối tượng so với các cấu trúc thông thường.

+0

Điều gì sẽ xảy ra nếu đối tượng có các thuộc tính phức tạp, không chỉ các loại giá trị; sau đó mỗi "phần" của đối tượng sẽ được lưu trữ trên một vị trí bộ nhớ khác; các đối tượng này cũng có thể bao gồm các đối tượng khác. Chỉ là một dự đoán đơn giản nhưng nó sẽ thực sự phức tạp để thực hiện một logic như vậy để lưu các đối tượng. – daryal

+0

Một trong những giảm chi phí và lợi ích lớn nhất cho năng suất là sự trừu tượng của bộ nhớ và phần cứng nói chung của .NET. Nếu bạn cần phải kiên trì với các yêu cầu cơ bản, hãy để khung công tác xử lý việc nâng hạng nặng (thường là như vậy) và đánh dấu lớp của bạn bằng [Serializable] và sử dụng các lớp có sẵn trong System.Runtime.Serialization.Formatters.Binary. – Michael

Trả lời

2

Trong C# bạn không có quyền truy cập vào bố cục bộ nhớ của đối tượng. Bạn không thể lấy được ảnh chụp nhanh của một đối tượng hoặc tạo một đối tượng từ ảnh chụp nhanh. Trong thực tế, bạn thậm chí không có điểm (có, bạn có chúng trong mã không an toàn, nhưng bạn hiếm khi viết mã không an toàn).

Thậm chí nếu bạn đã có quyền truy cập vào bộ nhớ được sử dụng bởi đối tượng, nó có thể không tồn tại được lưu vào đĩa và sau đó tải lại. Nếu bạn nâng cấp môi trường .NET, bạn có thể nhận được trình tối ưu hóa tốt hơn, quyết định sắp xếp lại các trường của đối tượng một cách khác nhau hoặc sử dụng sự liên kết bộ nhớ khác nhau.

Vì vậy, trong ngắn hạn - không có quyền truy cập vào bộ nhớ đối tượng, vì vậy bạn cần phải tuần tự hóa trường theo trường.

Mặt khác, vì .NET có phản xạ, việc tuần tự hóa một đối tượng theo cách này không khó. Trong thực tế, nó dễ dàng hơn nhiều so với tuần tự hóa một lớp C++ có chứa các con trỏ tới các lớp C++ khác.

+0

Vì vậy, vì.NET framework làm rất nhiều về quản lý bộ nhớ, bạn không có quyền truy cập trực tiếp vào bộ nhớ và ngay cả khi bạn đã làm nó sẽ là nguy hiểm. Điều đó làm cho rất nhiều ý nghĩa, cảm ơn! :) – user3604097

1

Định dạng tuần tự hóa nhị phân .NET sẽ loại bỏ các kiểu mà chúng muốn được lưu trữ và đặt vào một số siêu dữ liệu để bạn biết cách giải mã nó (loại, tên trường, v.v ...).

Đây không phải là chủ yếu cho interop với ngôn ngữ NET - mặc dù nó có thể được. Nó là cho interop với các phiên bản trong quá khứ và tương lai của các đối tượng tương tự, có thể được viết theo một cách để được đàn hồi để những thay đổi - hoặc ít nhất là biết để từ chối chúng. Trong C, nếu bạn thay đổi cấu trúc theo bất kỳ cách nào - và bạn vừa sử dụng write() để lưu trữ bộ nhớ, bạn cũng có thể chọn viết một số siêu dữ liệu để bạn có thể biết nếu bạn đã có phiên bản đúng hay không (và cần thiết để chuyển đổi).

Một lợi ích khác là ngôn ngữ .NET biết phải làm gì với tham chiếu. Theo mặc định, C sẽ write() một địa chỉ, điều này sẽ vô ích sau này. .NET cũng hỗ trợ ý tưởng về các trường không được tuần tự hóa (như mật khẩu) - một thứ khác bạn cần phải viết tay trong phiên bản C.

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