2012-03-06 32 views
5

Tôi có một đối tượng perl (tham chiếu đến mảng tài liệu tham khảo) như dưới đây:Lưu trữ đối tượng trên DB và lấy nó

my $a = [ [$a, $ab, $c ], [$a, $b, $c] ] ; 

và cần lưu trữ nó trên DB sau đó lấy nó.

Ai đó có thể đề xuất cơ chế tốt để tuần tự hóa ngay cả khi nén và sau đó lưu trữ nó trên DB? Sau đó deserialize nó và sử dụng nó trong mã?

Trả lời

7

Bạn có thể sử dụng bất kỳ trình tuần tự đã biết nào, ví dụ: JSON::XS hoặc Storable. Storable sẽ tốt hơn nếu bạn muốn truy xuất tham chiếu dưới dạng tham chiếu chứ không phải dưới dạng bản sao của giá trị. Sau đó lưu một đối tượng được tuần tự hóa trong trường của bất kỳ loại nào (VARCHAR, BLOB, ...) thỏa mãn các yêu cầu lưu trữ.

use Storable qw(nfreeze thaw); 
use DBI; 

# ... connect to database 
# Store 
my $data = [ [$a, $b, $c ], [ $a, $b, $c ] ]; 
my $bytestream = nfreeze $data; 
$dbh->do('insert into table (field) values(?)', undef, $bytestream); 

# Retrieve 
$bytestream = $dbh->selectrow_array('select field from table where ...'); 
$data = thaw $bytestream; 

Ngoài ra, bạn có thể nén $bytestream, ví dụ, thông qua IO::Compress::Gzip

my $bytestream = gzip nfreeze $data; 
+0

Tôi đã thử nó nhưng tôi nhận được các lỗi dưới đây: Không thể gọi phương thức "nfreeze" trên tài liệu tham khảo unblessed – smith

+0

Bạn có phương pháp nhập 'nfreeze'? Làm 'sử dụng qw đáng tin cậy (nfreeze)' hoặc viết tên đầy đủ của phương thức: 'Storable :: nfreeze ($ data)'. – Ali

+0

bạn có quyền cảm ơn, cũng là mô-đun giải nén gzip là gì? – smith

-1

Tôi chưa bao giờ thử nó, nhưng perldoc nói giá trị trả về của dữ liệu :: Dumper có thể được "đánh giá để lấy lại một bản sao giống hệt nhau của cấu trúc tham chiếu ban đầu". Sau đó bạn có thể đặt đầu ra Dumper vào một trường văn bản đủ lớn trong cơ sở dữ liệu.

+1

-1, điều này sẽ cho phép một cuộc tấn công SQL injection leo thang đến một cuộc tấn công thực thi mã từ xa. 'eval STRING' nên sử dụng rất thận trọng với bất kỳ dữ liệu nào không được tạo ra toàn bộ bởi chương trình gọi là 'eval STRING'. –

-1

Điều gì về Dữ liệu :: Dumper? Bạn có thể đổ các đối tượng vào trường TEXT của DB và sau đó đánh giá nội dung để lấy lại.

+0

-1, điều này sẽ cho phép một cuộc tấn công SQL injection leo thang đến một cuộc tấn công thực thi mã từ xa. 'eval STRING' nên sử dụng rất thận trọng với bất kỳ dữ liệu nào không được tạo ra toàn bộ bởi chương trình gọi là 'eval STRING'. –

+0

Mặc dù tôi đồng ý rằng bạn nên ghi nhớ điều này, OP không nói bất cứ điều gì về _where_ dữ liệu của anh ta đã được tạo ra. Vì vậy, tôi không thể thấy bất kỳ lý do gì để không đưa dữ liệu :: Dumper vào tài khoản. – fenton

+0

Nhận xét của tôi không phải là nơi mà dữ liệu được * dự định * đến từ đâu, nhưng nó có thể * đến từ đâu. Ý tưởng về [Defense in Depth] (http://en.wikipedia.org/wiki/Defense_in_depth_%28computing%29) là chủ động về bảo mật ở mỗi lớp của một ứng dụng nhằm ngăn chặn một lỗ hổng trong một lớp ảnh hưởng đến lớp. Nếu bạn đã từng gọi 'eval STRING' trên bất kỳ dữ liệu nào được trả về từ cơ sở dữ liệu của bạn thì bạn đã cấp cho cơ sở dữ liệu của bạn quyền truy cập đầy đủ để thực thi mã trong ứng dụng của bạn. Bất kỳ sự vi phạm nào đối với cơ sở dữ liệu của bạn hiện có toàn quyền kiểm soát toàn bộ ứng dụng của bạn. ** Không thực thi dữ liệu! ** –

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