2016-11-27 23 views
7

Tôi có một cấu trúc phức tạp được lưu trong cơ sở dữ liệu MySQL bằng cách sử dụng hàm sericalize() và sau đó được chuyển đổi trở lại bằng cách sử dụng unserialize(). Sau khi di chuyển hệ thống từ PHP 5.3 lên PHP 5.6 và unserializing trong 5.6 dữ liệu đã được đăng trên 5.3, các cấu trúc bị hỏng. Một số tham chiếu đến đối tượng giờ đây xuất hiện dưới dạng mảng thay thế.Di chuyển tuần tự hóa PHP từ PHP 5.3 sang PHP 5.6

Câu hỏi của tôi là:

  1. Có một đặc điểm kỹ thuật về mã hóa khác nhau được sử dụng bởi serialization/unserialization trong các phiên bản PHP khác nhau? (Không thể tìm thấy bất kỳ điều gì đủ cụ thể trong các tìm kiếm trên Google của tôi hoặc trong tài liệu trên PHP.net)

  2. Làm cách nào để chuyển đổi dữ liệu tuần tự từ mã hóa PHP 5.3 sang mã hóa PHP 5.6?

+0

Xin chào, Bạn có thể cung cấp thêm thông tin về những gì được bắt chước theo thứ tự không? Nó là một lớp hay chỉ là một mảng dữ liệu? –

+1

Khi bạn deserialize các đối tượng, bạn phải bao gồm các định nghĩa lớp trong mã. Vì vậy, nếu bạn đang thử nghiệm bên ngoài cơ sở mã thông thường của bạn từ nơi bạn lưu trữ các đối tượng, hoặc nếu bạn đã thay đổi cấu trúc đối tượng sau đó họ sẽ không deserialize một cách chính xác. Nếu bạn cần thay đổi cấu trúc đối tượng, giữ các đối tượng cũ, và sau đó tạo lại các đối tượng mới bằng cách sử dụng cấu trúc mới và reserialize. (Không đăng câu trả lời vì tôi không ở vị trí để kiểm tra nó - nhưng chúng là những thứ cần tìm!) – Robbie

Trả lời

1

Bạn có thể chuyển đổi dữ liệu được tuần tự hóa thành JSON (sử dụng cài đặt PHP 5.3), lưu nó vào cơ sở dữ liệu và sau đó thực hiện thay thế (bằng cách cài đặt PHP 5.6).

Từ 5.3 đến JSON:

$data = unserialize($strSerializedData); 
$jsonData = json_encode($data); 

Từ JSON để 5.6:

$data = json_decode($jsonData); 
$strSerializedData= serialize($data); 

Bạn có thể cần phải điều chỉnh các tùy chọn mà bạn gửi cho json_decode để phù hợp với dữ liệu gốc.

Tùy chọn này sẽ phụ thuộc vào dữ liệu nào đang được đăng. Nếu dữ liệu của bạn là các lớp, điều này sẽ không hoạt động.

Ngoài ra, bạn có thể vấn đề liên quan đến ghi chú này trong tài liệu (here):

5.6.0 Thao tác với dữ liệu tuần tự bằng cách thay thế C: với O: để buộc đối tượng instantiation mà không gọi các nhà xây dựng sẽ bây giờ thất bại.

+0

Vì câu hỏi là về serliazation/deserialisation của các đối tượng và bạn chỉ ra chính xác "Nếu dữ liệu của bạn là các lớp, điều này sẽ không hoạt động. " sau đó vâng - điều này sẽ không hoạt động. Bạn có thể tạo một phương thức "toJSON()" và "fromJSON()" trong lớp và sử dụng nó để truy cập vào internals, nhưng nếu bạn đi xa, thì bạn cũng có thể viết các hàm serliaze/deserialize của riêng bạn! Và để làm điều đó, sử dụng giao diện 'serializable' (http://php.net/manual/en/class.serializable.php) – Robbie

+0

Đồng ý rằng điều này sẽ không hoạt động đối với một lớp. Câu hỏi sẽ cần làm rõ. –

+0

Nó thực sự là một đối tượng từ một lớp mà tôi đang tuần tự hóa. Đối tượng có tham chiếu đến các đối tượng của cùng một lớp và cũng đến các lớp khác. Một số các lớp này lần lượt tham chiếu lại đối tượng tham chiếu chúng. Sử dụng serialize(), các tham chiếu chéo này được biểu thị bằng r: theo sau là một số. Một số tài liệu tham khảo bị hỏng khi unserializing chúng trong php 5.6, và những gì nên là một đối tượng lớp trong một mảng thay thế. –

2

Có, việc tuần tự hóa các đối tượng đã được thay đổi trong PHP5.6. Cụ thể một số lĩnh vực liên quan đến serialization của các đối tượng được tided lên trong PHP5.6

Có một lưu ý mơ hồ nhắc này trong PHP unserialize manual:

5.6.0 Thao tác với dữ liệu tuần tự bằng cách thay thế C: với O: để ép buộc đối tượng khởi tạo mà không cần gọi hàm tạo bây giờ là không thành công.

Tuy nhiên, hãy xem danh sách lỗi cho biết thêm một chút nữa đã đi vào dưới nắp trong report 68099.Nó cũng khẳng định rằng định dạng ban đầu không có tài liệu chính thức:

"hành vi ban đầu (mà chúng tôi cho phép định dạng serialize cũ để được sử dụng cho các lớp học sử dụng định dạng mới) không bao giờ được ghi lại cũng không hỗ trợ chính thức,"

Lưu ý rằng kết quả cuối cùng của cuộc thảo luận đó là "Sẽ không sửa chữa".

Vì vậy, về cơ bản, lựa chọn của bạn là:

  • Hãy thử một trong những serializers khác như một cách để xuất các dữ liệu giữa các phiên bản PHP. Chẳng hạn như session_encode cũng có thể xử lý các đối tượng.

  • Tập lệnh chuyển đổi. Có phiên bản được biên soạn rộng rãi của định dạng hiện tại trên PHP internals, mà bạn có thể sử dụng với trình biến lặp trên định dạng cũ để cập nhật cú pháp.

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