weixin_42510117
2014-05-30 04:06
浏览 1.1k

protobuf 序列化 c++

大家好,请问大家一个protobuf序列化的问题,我用的pb版本是2.5.0,问题是:
生成的头文件里面只有一个SerializeWithCachedSizes方法,我想把这个类序列化成字节数组,通过网络发送出去,网上pb教程中不少提到了SerializeToArray方法,很符合我的要求,为什么我的头文件中没有这个方法呢?首次使用pb,还不是很熟悉,如果可以解决,请您尽量附上完整代码,小弟在此谢过了!!!

[color=blue][size=large]proto文件如下[/size][/color]:
[code="java"]
package ddz.proto;

option optimize_for = LITE_RUNTIME;
option java_package = "ddz.proto";
option java_outer_classname = "Login";

message LoginMessage {
optional string userAccount = 1;
}
[/code]

[color=blue][size=large]生成命令[/size][/color]
[code="java"]
protoc -I=./ --cpp_out=./ ./hello.proto
[/code]

[color=blue][size=large]生成的头文件如下:[/size][/color]
[code="java"]
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: hello.proto

#ifndef PROTOBUF_hello_2eproto__INCLUDED
#define PROTOBUF_hello_2eproto__INCLUDED

#include

#include

#if GOOGLE_PROTOBUF_VERSION < 2005000
#error This file was generated by a newer version of protoc which is
#error incompatible with your Protocol Buffer headers. Please update
#error your headers.
#endif
#if 2005000 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION
#error This file was generated by an older version of protoc which is
#error incompatible with your Protocol Buffer headers. Please
#error regenerate this file with a newer version of protoc.
#endif

#include
#include
#include
#include
// @@protoc_insertion_point(includes)

namespace ddz {
namespace proto {

// Internal implementation detail -- do not call these.
void protobuf_AddDesc_hello_2eproto();
void protobuf_AssignDesc_hello_2eproto();
void protobuf_ShutdownFile_hello_2eproto();

class LoginMessage;

// ===================================================================

class LoginMessage : public ::google::protobuf::MessageLite {
public:
LoginMessage();
virtual ~LoginMessage();

LoginMessage(const LoginMessage& from);

inline LoginMessage& operator=(const LoginMessage& from) {
CopyFrom(from);
return *this;
}

static const LoginMessage& default_instance();

#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER
// Returns the internal default instance pointer. This function can
// return NULL thus should not be used by the user. This is intended
// for Protobuf internal code. Please use default_instance() declared
// above instead.
static inline const LoginMessage* internal_default_instance() {
return default_instance_;
}
#endif

void Swap(LoginMessage* other);

// implements Message ----------------------------------------------

LoginMessage* New() const;
void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from);
void CopyFrom(const LoginMessage& from);
void MergeFrom(const LoginMessage& from);
void Clear();
bool IsInitialized() const;

int ByteSize() const;
bool MergePartialFromCodedStream(
::google::protobuf::io::CodedInputStream* input);
void SerializeWithCachedSizes(
::google::protobuf::io::CodedOutputStream* output) const;
int GetCachedSize() const { return cached_size; }
private:
void SharedCtor();
void SharedDtor();
void SetCachedSize(int size) const;
public:

::std::string GetTypeName() const;

// nested types ----------------------------------------------------

// accessors -------------------------------------------------------

// optional string userAccount = 1;
inline bool has_useraccount() const;
inline void clear_useraccount();
static const int kUserAccountFieldNumber = 1;
inline const ::std::string& useraccount() const;
inline void set_useraccount(const ::std::string& value);
inline void set_useraccount(const char* value);
inline void set_useraccount(const char* value, size_t size);
inline ::std::string* mutable_useraccount();
inline ::std::string* release_useraccount();
inline void set_allocated_useraccount(::std::string* useraccount);

// @@protoc_insertion_point(class_scope:ddz.proto.LoginMessage)
private:
inline void set_has_useraccount();
inline void clear_has_useraccount();

::std::string* useraccount_;

mutable int cached_size;
::google::protobuf::uint32 has_bits[(1 + 31) / 32];

#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER
friend void protobuf_AddDesc_hello_2eproto_impl();
#else
friend void protobuf_AddDesc_hello_2eproto();
#endif
friend void protobuf_AssignDesc_hello_2eproto();
friend void protobuf_ShutdownFile_hello_2eproto();

void InitAsDefaultInstance();
static LoginMessage* default_instance_;
};
// ===================================================================

// ===================================================================

// LoginMessage

// optional string userAccount = 1;
inline bool LoginMessage::has_useraccount() const {
return (_has_bits_[0] & 0x00000001u) != 0;
}
inline void LoginMessage::set_has_useraccount() {
has_bits[0] |= 0x00000001u;
}
inline void LoginMessage::clear_has_useraccount() {
has_bits[0] &= ~0x00000001u;
}
inline void LoginMessage::clear_useraccount() {
if (useraccount_ != &::google::protobuf::internal::kEmptyString) {
useraccount_->clear();
}
clear_has_useraccount();
}
inline const ::std::string& LoginMessage::useraccount() const {
return useraccount_;
}
inline void LoginMessage::set_useraccount(const ::std::string& value) {
set_has_useraccount();
if (useraccount_ == &::google::protobuf::internal::kEmptyString) {
useraccount_ = new ::std::string;
}
useraccount_->assign(value);
}
inline void LoginMessage::set_useraccount(const char
value) {
set_has_useraccount();
if (useraccount_ == &::google::protobuf::internal::kEmptyString) {
useraccount_ = new ::std::string;
}
useraccount_->assign(value);
}
inline void LoginMessage::set_useraccount(const char* value, size_t size) {
set_has_useraccount();
if (useraccount_ == &::google::protobuf::internal::kEmptyString) {
useraccount_ = new ::std::string;
}
useraccount_->assign(reinterpret_cast(value), size);
}
inline ::std::string* LoginMessage::mutable_useraccount() {
set_has_useraccount();
if (useraccount_ == &::google::protobuf::internal::kEmptyString) {
useraccount_ = new ::std::string;
}
return useraccount_;
}
inline ::std::string* LoginMessage::release_useraccount() {
clear_has_useraccount();
if (useraccount_ == &::google::protobuf::internal::kEmptyString) {
return NULL;
} else {
::std::string* temp = useraccount_;
useraccount_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);
return temp;
}
}
inline void LoginMessage::set_allocated_useraccount(::std::string* useraccount) {
if (useraccount_ != &::google::protobuf::internal::kEmptyString) {
delete useraccount_;
}
if (useraccount) {
set_has_useraccount();
useraccount_ = useraccount;
} else {
clear_has_useraccount();
useraccount_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);
}
}

// @@protoc_insertion_point(namespace_scope)

} // namespace proto
} // namespace ddz

// @@protoc_insertion_point(global_scope)

#endif // PROTOBUF_hello_2eproto__INCLUDED

[/code]

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • finallygo 2014-05-30 16:22
    已采纳

    我用的也是2.5 java版本的,但是应该是一样的,转换成字节数组的方法在MessageLite里,不在生成的代码里

    另外,你不用ide的么?? 应该可以直接联想出来的

    点赞 评论

相关推荐 更多相似问题