2015-10-29 37 views
1

這不起作用:如何使用boost :: serialization序列化TAO :: unbouded_basic_string_sequence <T>?

template <class Archive, typename T> 
    inline void save(Archive& arch, const TAO::unbounded_basic_string_sequence<T>& varSequence, unsigned int version) 
    { 
     size_t length = varSequence.length(); 
     arch & length & make_array(varSequence.get_buffer(), length); 
    } 

    template <class Archive, typename T> 
    void load(Archive& arch, TAO::unbounded_basic_string_sequence<T>& varSequence, unsigned int version) 
    { 
     size_t length; 
     arch & length; 

     varSequence.length(length); 
     arch & make_array(varSequence.get_buffer(), length); 
    } 


    template <class Archive, typename T> 
    inline void serialize(Archive& arch, TAO::unbounded_basic_string_sequence<T>& varSequence, const unsigned int version) 
     { 
      split_free(arch, varSequence, version); 
     } 

的compiller說:

(..)/include/boost/serialization/access.hpp:118:9: error: request for member 'serialize' in 't', which is of non-class type 'char' 

我知道,C風格的字符串不被升壓::序列化的支持。理論上我可以使用std :: string作爲save(),但我不知道如何從std :: string返回到TAO :: unbouded_basic_string_sequence - 這個類幾乎沒有任何文檔。

回答

2

你的困惑似乎是你期望序列包含字符,而實際上它包含以零結尾的字符串。

從查看實現代碼(實際上文檔不是很有幫助),似乎無界基本字符串序列使用字符串特徵來知道如何操作字符串。

T = char的性狀表明StringManager_T<T>類用於「管理」字符串。所以,這是一個複雜的設置,其中序列存儲原始指針到「無主」零終止字符串。

但是,通過特徵暗示的是,所有操作都是通過使用StringManager的string_sequence_element代理完成的,並且這模擬了以空字符結尾的字符串的值語義。例如。 assignment is done like

00055 { 
00056 CORBA::string_free (this->ptr_); 
00057 this->ptr_ = CORBA::string_dup (p); 
00058 return *this; 
00059 } 

我沒有辦法來測試這一切的正確操作,但這裏有一個原始的嘗試,你可以嘗試:

namespace boost { namespace serialization { 

    template <typename Archive, typename T> 
     inline void save(Archive& ar, TAO::unbounded_basic_string_sequence<T> const& varSequence, unsigned int /*version*/) 
     { 
      ar & varSequence.length(); 

      std::basic_string<T> scratch; 
      scratch.reserve(256); 

      for (size_t i = 0; i < varSequence.length(); ++i) { 
       scratch.assign(varSequence[i]); // assumes zero-terminated 
       ar & scratch; 
      } 
     } 

    template <typename Archive, typename T> 
     void load(Archive& ar, TAO::unbounded_basic_string_sequence<T>& varSequence, unsigned int /*version*/) 
     { 
      size_t length; 
      ar & length; 
      varSequence.length(length); 

      std::basic_string<T> scratch; 
      scratch.reserve(256); // some sane starting point? 

      for (size_t i = 0; i < varSequence.length(); ++i) { 
       ar & scratch; 
       varSequence[i] = scratch.c_str(); 
      } 
     } 

    template <typename Archive, typename T> 
     inline void serialize(Archive& ar, TAO::unbounded_basic_string_sequence<T>& varSequence, const unsigned int version) 
     { 
      split_free(ar, varSequence, version); 
     } 

    template <typename Archive> 
     inline void serialize(Archive& ar, SequenceOfString& sos, unsigned int /*version*/) { 
      ar & base_object<TAO::unbounded_basic_string_sequence<char> >(sos); 
     } 
+0

完美地工作,謝謝 - 一件小事:save()應該獲得被const引用序列化的對象。 – Siekacz

+0

@Siekacz hrm?我有,對吧?我編譯了代碼(我只是無法鏈接它,因爲我沒有TAO構建) – sehe

+0

哦,是的 - 只是沒有看到const之前:) – Siekacz

0

你正在服用哪些你不應該在所有采取的路線對我的想法。當您使用IDL並根據此類生成類型映射時,應使用由TAO生成的CORBA(de)序列化,並使用IDL到C++映射定義的類型,現在您正在使用所有類型的內部類。

在你有IDL類型的時候,你可以使用CodecFactory支持將這些類型序列化爲一個字節序列,例如ACE_wrappers/TAO/tests/Codec代碼。使用CodecFactory,您可以通過可移植的方式與任何CORBA供應商合作。

+0

然後顯示一個文檔如何去做 - 沒有什麼在網上。我需要XML或可讀的東西,而不是二進制。 – Siekacz

+0

沒有標準化的方式來編組IDL到XML或可讀的東西,只有一個二進制形式是CORBA規範的一部分。作爲DAnCE的一部分,有代碼能夠從XML中讀取D&C數據並將其轉換爲IDL表示形式,請參閱ACE_wrappers/TAO/DAnCE/tools/Convert_Plan,它可以開始爲類型執行類似操作。 –

相關問題