2010-01-24 34 views
8

Có điều gì đó tương tự như tuần tự hóa Java/.NET cho C++ không?Có thể tự động tuần tự hóa đối tượng C++ không?

+2

Không vì C++ không có phản xạ thời gian chạy. Xem sths câu trả lời cho một lựa chọn tốt. –

+2

Bản sao của http://stackoverflow.com/questions/1810372/c-serialization-library-that-supports-partial-serialization và http://stackoverflow.com/questions/1809670/how-to-implement-serialization-in -c và http://stackoverflow.com/questions/234724/how-to-serialize-in-c và nhiều thứ khác được tìm thấy với tìm kiếm khó hiểu và phức tạp http://stackoverflow.com/search?q=c%2B% 2B + serialization + library – dmckee

Trả lời

12

Tăng cường chứa serialization library. Tôi đã không sử dụng nó bản thân mình, nhưng thường là các thư viện tăng hoạt động khá tốt.

+6

trong khi bạn trả lời câu hỏi trong nội dung, bạn không giải quyết câu hỏi trong tiêu đề - đó là câu hỏi thú vị hơn –

+0

Câu trả lời cho câu hỏi trong tiêu đề là: Không, C++ không tự động serialize các đối tượng của bạn. – sth

6

Thật không may là không có cách tự động để tuần tự hóa các đối tượng trong C++. Đó là bởi vì bất kỳ công cụ tuần tự hóa nào cần phải có khả năng "hiểu" đối tượng được tạo tùy chỉnh của bạn trong thời gian chạy và C++ không chứa thông tin cần thiết cho điều đó. Java và .Net ở phía bên kia có, những gì được gọi là, Reflection. Cơ chế này cho phép bất kỳ ai duyệt qua cấu trúc dữ liệu của bất kỳ đối tượng tùy ý nào trong thời gian chạy.

Tất cả điều này không có nghĩa là không có cách nào để tuần tự hóa đối tượng C++ với một nỗ lực tương đối nhỏ. Lấy ví dụ thư viện luồng C++ chuẩn. Bằng cách viết

int x = 2010; 
cout << x << endl; 

bạn thực sự sắp xếp một đối tượng kiểu int. Có thể mở rộng cơ chế này để hỗ trợ lớp tùy chỉnh của bạn. Việc này được thực hiện chỉ bằng toán tử quá tải < <. Nó không phải là tốt đẹp như serialization Java, nhưng nó rất thuận tiện quá.

Ngoài ra còn có một số thư viện giúp đơn giản hơn. Như ai đó đã đề cập, boost serialization library thực hiện tốt công việc. Làm việc với serialization tăng trông rất giống với làm việc với iostream nhưng nó giải quyết một số vấn đề vốn có cho các luồng chuẩn.

3

Google protocol buffers cung cấp triển khai C++ trong gói cốt lõi; như một lợi ích tốt đẹp, sau đó bạn có thể chia sẻ dữ liệu này với lots of other languages - nhưng bạn sẽ bị giới hạn sử dụng các loại được tạo ra hơn là của riêng bạn (một số công cụ tuần tự hóa hỗ trợ ngôn ngữ khác).

Thực tế đây không phải là vấn đề, vì (nếu cần) bạn chỉ có thể xem các loại được tạo dưới dạng DTO ghép đôi với các đối tượng tên miền thực tế của bạn.

3

Boost.Serialization là một thư viện rất tốt và nó cũng hỗ trợ versioning cơ bản - một thứ không bao giờ hoàn toàn có thể với serialization tự động. Bởi vì tôi đã xảy ra cần phiên bản tốt hơn, tôi thực sự đã viết thư viện tuần tự hóa riêng của mình theo phong cách Boost.Serialization (vì tác giả của Boost.Serialization không quan tâm đến việc cải thiện nó).

Lưu ý rằng bạn cũng có thể lạm dụng chức năng tuần tự hóa cho các mục đích khác như GUI hoặc tạo biểu mẫu web, nếu thêm một chút dữ liệu trợ giúp (xem cách Boost.Serialization thực hiện XML). Cần lưu ý rằng phương pháp phổ biến để lưu toàn bộ cấu trúc (bằng cách truyền chúng thành char * và viết sizeof (struct) bytes) hoàn toàn không thể chuyển đổi, nó không hỗ trợ phiên bản và nó phá vỡ nếu cấu trúc có chứa bất kỳ con trỏ hoặc các đối tượng C++ (không phải POD).

1

Với rất nhiều công việc grunt thủ công (thực sự, triển khai RTTI xâm nhập hoặc không xâm nhập của bạn), bạn có thể đạt được mức tự động hóa tương đương với C#/Java.

Xem thông tin chi tiết ở đây:

How to implement serialization in C++

1

Tôi đã sử dụng thành công này:

http://uscilab.github.io/cereal/

và nó làm việc tốt cho tôi trên cả iOS và Android. Nó là một thư viện chỉ tiêu đề và không có phụ thuộc bên ngoài vì vậy nó rất thuận tiện để sử dụng. Tôi thích nó hơn thúc đẩy bởi vì tôi không muốn nhập khẩu tất cả phụ thuộc tăng. Thư viện nhỏ và hỗ trợ cả hai định dạng xê-ri XML, JSON, nhị phân và tùy chỉnh.

Thư viện (như tăng) yêu cầu bạn viết rõ ràng một số mã tuần tự và mã tuần tự hóa cho các lớp cơ sở, trong khi các bộ sưu tập được xử lý tự động.

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