2010-10-11 76 views
1

將數據序列化到數據庫中的最佳模塊或方法是什麼?如何序列化和反序列化數據到Perl數據庫?

目前,我尋找到可存儲的功能freezethaw,例如:

use Storable qw(freeze thaw); 
use strict; 

my %array_test = ('Year Average' => 0.1, 'Color Average' => 0.8, 'Humans' => 0, 'Units' => 1); 
my $serialized_data = freeze(\%array_test); 
my %deserialized_data = %{ thaw($serialized_data) }; 

我想知道些什麼:

  1. 是否有Perl的任何本地命令序列化和反序列化數據?
  2. 可存儲一個序列化和反序列化到數據庫的好方法,還是有更好的方法/周圍的模塊?
  3. 在存儲它之前,我應該對序列化執行其他操作嗎?
+3

使用nfreeze,不凍結,任何非瞬態的。 – ysth 2010-10-11 01:01:13

回答

2

答案取決於您需要序列化的數據類型。

  1. 本機:有包/解壓,爲純數字數組,你可以用逗號等加入...任何的簡單的本地方法是非常特定領域,並不適用於一般的數據。

  2. Storable是一種很好的標準方法。還有其他人(我聽說過FreeseThaw但從未使用過)。您也可以執行YAML或JSON格式 - 爲了進行比較,請參閱最近StackOverflow question關於通過IO :: Socket :: INET(其中還涉及序列化)發送數據的數組。

  3. 進一步的編碼需要依賴於你做的序列化,以及你對數據做了什麼。

    E.g.如果序列化保留純文本字符串,並且這些字符串可以包含引號,並且您在SQL語句中間使用序列化數據(而不是綁定變量),則需要對引號進行編碼。

+0

謝謝,有很多幫助...是否需要清理我序列化的東西?我的意思是,打破序列化很容易如何? – Prix 2010-10-11 00:50:56

+0

@Prix - 取決於序列化以及您想要清理的內容和方式。大多數正常的編碼模式都是100%無損的,因此unseialize(decode(encode(serialize(D))))的結果將是原始數據D(例如,查看URI編碼,或轉義CSV數據中的引號) 。 – DVK 2010-10-11 00:55:37

+0

關於你提到的話題,你可以確認鏈接是這一個http://stackoverflow.com/questions/2824363/how-can-i-share-perl-data-structures-through-a-socket,如果是的話更新它在你的回覆中提供了可能會遇到的其他人的進一步參考嗎?謝謝 – Prix 2010-10-11 00:56:17

2

你想要序列化什麼?有很多Perl模塊可以處理這類事情,但每個模塊都有缺點。我在掌握了關於此的Perl的一章,但也有來自印度尼西亞Perl mongers的comparison of serializers

如果它真的只是字符串,就像你展示的那樣,那麼大多數東西都可以很好地處理你的數據。如果你想存儲諸如代碼引用或Perl對象之類的東西,那麼你有更艱難的時間。

但需要考慮的一件事是,您不一定要將數據限制爲Perl。如果另一種語言的程序想要獲取您的數據,則像YAML或JSON這樣的程序會更友好。我討厭將事情鎖定在未來的決策中,所以我不喜歡純Perl解決方案,除非我真的需要它們。

小心那些在知道自己想要存儲之前回答的人。 :)

+0

+1不錯的鏈接和信息謝謝。 – Prix 2010-10-12 00:21:05