2010-09-14 17 views
12

Std :: map serileştirmek için Boost.Serialization kullanıyorum. kod derlenmiş ve Mac Snow Leopard ve Ubuntu Lucid 10,04 kod test buBoost.Serialization farklı platformlarda farklı serileştirir mi?

void Dictionary::serialize(std::string & buffer) 
{ 
    try { 
    std::stringstream ss; 
    boost::archive::binary_oarchive archive(ss); 
    archive << dict_; 
    buffer = ss.str(); 
    } catch (const std::exception & ex) { 
    throw DictionaryException(ex.what()); 
    } 
} 

void Dictionary::deserialize(const char * const data, int length) 
{ 
    try { 
    namespace io = boost::iostreams; 
    io::array_source source(data, length); 
    io::stream<io::array_source> in(source); 
    boost::archive::binary_iarchive archive(in); 
    archive >> dict_; 
    } catch (const std::exception & ex) { 
    throw DictionaryException(ex.what()); 
    } 
} 

I benziyor. Her iki sistemde de 1.00 Yükseltme var. Mac’te kodu kendim kurdum. Ubuntu kutucuğunda, ikilileri yetenekle aldım.

Sorun: Mac'te haritayı serileştirdiğimde, Ubuntu kutusundaki seri hale getiremiyorum. Denediğimde geçersiz imzalı istisnası alıyorum.

cevap

15

, ikili arşivler yerine text_iarchive ve text_oarchive kullanmayı deneyin. Bu eğitimde documentation

, biz bir belirli arşiv sınıfını kullandık - kaydetmek için text_oarchive ve yükleme için text_iarchive. text arşivi metin olarak veri oluşturur ve platformlar arasında taşınabilir vardır. Metin arşivlerine ek olarak , kitaplık, yerel ikili verileri ve xml biçimli veriler için arşiv sınıfını içerir. Tüm arşiv sınıfları ile aynıdır. Serileştirme bir sınıf için tanımlandığında, bu sınıf herhangi bir arşiv için serileştirilmiş olabilir.

+5

Bunun, uygulamanızın performansı üzerinde çok önemli bir etkisi olabileceğini unutmayın. –

9

boost: arşiv :: binary_xarchive şu anda farklı platformlarda farklılıklar olabileceği anlamına gelir tesfiri ile

taşınabilir değildir. Metin arşivleri, tüm sistemlerde aynı girdi/çıktı davranışını verir.
Ayrıca orada ikili arşivlerin taşınabilirlik sorununu çözmeye çalışır ilgili YAPILACAK giriştir: TODO Entry

3

Cevapları katılıyorum ama aydınlatıcı bir not eklemek istedim. Bunun can sıkıcı bir göz olduğunu düşünebilirsiniz, ancak aslında taşınabilir bir ikili formatı bulmak ve uygulamak böylesine önemsiz bir görev değildir. Bu ikili numaralı sorunu etkin bir şekilde ele aldığının farkında olduğum tek standart ASN.1'dur.

XML pruports aynı sorunu çözmek için kullanılır, ancak genellikle metin içinde yapar. XML'in Fast Infoset adı verilen XML için bir geri yükleme standardı vardır, bu da XML'in verileri ikili formda kodlamasını sağlar, ancak ASN.1 kullanır.

+0

Vay. Daha önce "etkili" ve "ASN.1" duyduğuma emin değilim. Ama sonra, bir ASN'de hata ayıklamak zorunda kaldım.Başka birinin yazmış olduğu 1 ayrıştırıcıyı, bu yüzden saatlerce süren zorlu acılarla ilişkilendirmeye eğilimliyim. Aslında ASN.1'in hatası olmayabilir. –

+0

Ben tartışmıyorum. Bu benim hatam. Boost.Serialization belgelerini okumalıydım. Metin gayet iyi. –

+0

@Steve Jessop - Senin suçun değil, ama çoğunlukla görevin hatası olduğunu düşünüyorum. Muhtemelen orada bazı genel ASN.1 ayrıştırıcıları vardır, ancak gördüğüm her şey sadece ASN.1'in alt kümesini diğer tarafın kimden beklediğini ayrıştırır. Bu bile kıllı bir görev. –

7

text_archives ile yapılan performans, binary_archive'den daha yavaştır. Performansın sizin için bir şey varsa, an unofficial portable binary archiveeos_portable_archive'u deneyebilirsiniz. Windows'da 32 bit ve 64 bit veriyi seri hale getirmek için kullandım. Onu verebilirsin.

Dosyaları seri hale getirme dizinine koymanız yeterli. Dosyalar en son yükseltme sürümü (1.44.0) ile güncel değildir, ancak sadece 2 çok önemsiz ayarlamalar yapabilmeniz için çalışmanız gerekir (derleyiciniz çok açık bir hata mesajı ile size söyleyecektir).

+1

'eos_portable_archive', anlaşmayı bozduğum serileştiren wstringleri desteklemiyor. Bu sınırlama olmayan boost (libre/libs/serialization/example) ile gelen bir portable_binary_iarchive.hpp var ve benim için iyi çalıştı. Başka belgelere de sahiptir [burada belgelenmiştir] (http://www.boost.org/doc/libs/1_47_0/libs/serialization/doc/todo.html#portablebinaryarchives) –

+0

@Omer Raviv: Taşınabilir arşiv desteklemiyor Bu noktada benim için kırılmış olan kayan nokta türleri serileştirildi. Aslında, 'serileştirme' serisinin [http://lists.boost.org/boost-users/2010/09/63015.php), onu terk ettiğim ve kendi . Daha yeni sürümlerin bunu düzeltip düzeltmediğinden emin değilim. – kizzx2

+3

** GÜNCELLEME: ** EOS taşınabilir arşiv v5.0 şimdi [wstring'i destekler] (http://epa.codeplex.com/releases/view/91073). Yeni ev [burada] (http://epa.codeplex.com/). –