0 0

protobuf 序列化 c++5

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

proto文件如下
package ddz.proto;

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

message LoginMessage {
  optional string userAccount = 1;
}


生成命令
protoc -I=./ --cpp_out=./ ./hello.proto


生成的头文件如下:
// Generated by the protocol buffer compiler.  DO NOT EDIT!
// source: hello.proto

#ifndef PROTOBUF_hello_2eproto__INCLUDED
#define PROTOBUF_hello_2eproto__INCLUDED

#include <string>

#include <google/protobuf/stubs/common.h>

#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 <google/protobuf/generated_message_util.h>
#include <google/protobuf/message_lite.h>
#include <google/protobuf/repeated_field.h>
#include <google/protobuf/extension_set.h>
// @@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<const char*>(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

2014年5月30日 04:06

1个答案 按时间排序 按投票排序

0 0

采纳的答案

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

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

2014年5月30日 16:22

相关推荐

    protobuf序列化和反序列化技术

    protobuf序列化和反序列化技术是大数据处理领域中不可或缺的一部分,尤其在实时大数据场景下,高效的数据传输和存储对性能有着直接影响。谷歌推出的Protocol Buffers(简称protobuf)是一种语言无关、平台无关的数据...

    protobuf 序列化工具类

    - **小巧高效**:protobuf序列化后的数据通常比XML或JSON小3-10倍,解析速度也更快。 - **可扩展性**:新版本的消息可以兼容旧版本,只需保证旧字段不被删除即可。 - **类型安全**:protobuf在编译时进行类型检查...

    Unity 中使用Protobuf进行序列化和反序列化的Demo

    本Demo将展示如何在Unity中集成并使用Protobuf进行数据的序列化和反序列化操作。 首先,你需要了解什么是序列化和反序列化。序列化是将对象的状态转换为可以存储或传输的数据格式的过程,而反序列化则是将这些数据...

    protobuf常用序列化和反序列化API

    **protobuf常用序列化和反序列化API** protobuf(Protocol Buffers)是Google开发的一种数据序列化协议,广泛应用于网络通信、数据存储等领域。它提供了一种高效、灵活且跨平台的方式来编码和解码结构化数据。...

    java序列化之protobuf

    1. 性能:protobuf序列化和反序列化速度比Java序列化快很多。 2. 数据大小:protobuf编码的数据通常比JSON或XML更小,节省了存储和网络传输成本。 3. 版本兼容性:protobuf允许添加新的字段而不破坏旧的序列化数据,...

    C++ JSON 序列化与反序列化

    本篇文章将深入探讨C++中JSON的序列化与反序列化。 **一、JSON序列化** 序列化是指将C++的对象转换为JSON字符串的过程,以便在网络上传输或保存到文件中。常见的C++ JSON序列化库有RapidJSON、nlohmann/json、...

    Hive 对 Protobuf 序列化文件读取.zip

    本话题主要关注如何使用Hive读取Protobuf序列化的文件,这是一种高效的数据序列化协议,广泛应用于跨语言的数据交换。 **Protobuf(Protocol Buffers)** 是Google开发的一种数据序列化协议,它定义了一种结构化...

    protobuf序列化JAVA使用的JAR包V3.15

    标题中的"protobuf序列化JAVA使用的JAR包V3.15"指的是protobuf的Java实现,版本为3.15,以JAR(Java Archive)的形式提供。JAR文件是Java平台特有的归档文件,包含了编译后的类文件和其他资源,使得开发者可以直接...

    C++使用protobuf 作为网络消息协议

    标题中的"C++使用protobuf作为网络消息协议"指出,我们将探讨如何在C++编程环境中利用Protocol Buffers(protobuf)这一高效的数据序列化工具来构建网络通信的消息协议。protobuf是由Google开发的一种语言中立、平台...

    protobuf C++库

    1. 轻量级:protobuf序列化后的数据大小通常远小于XML,且解析速度更快,适合性能敏感的应用。 2. 零拷贝:protobuf支持零拷贝序列化,减少不必要的内存操作,提高效率。 3. 缓存已知字段:protobuf对已知字段的...

    protobuf-3.3.0 c++ win静态库

    4. **编写和使用protobuf消息**:在C++代码中,你可以定义`.proto`文件中的消息类型,使用protobuf提供的API进行序列化和反序列化操作。 5. **静态链接protobuf库**:在编译选项中,选择静态链接protobuf库,这样你...

    Windows下VC++使用protobuf 完整例子

    Protocol Buffers(protobuf)是Google提供的一个开源序列化框架,这个demo将演示如何在Windows下VC++使用protobuf 配套文章地址:http://blog.csdn.net/mycwq/article/details/17606527

    自己实现的protobuf 压缩类,并能序列化反序列化

    protobuf是一种高效的数据序列化协议,它允许开发者将结构化的数据转换为二进制流,以便在网络传输或存储时占用更少的空间。这个压缩类可能是为了在处理protobuf数据时进一步优化存储效率,通过压缩技术减少数据体积...

    Python调用序列化数据工具Protocol Buffers——protobuf

    2. **编译器**: 使用protobuf编译器将`.proto`文件转换为特定语言(如Python、Java、C++)的源代码,生成的数据结构包含序列化和反序列化的方法。 3. **序列化与反序列化**: 序列化是将结构化数据转换为二进制流的...

    ProtoBuf的介绍以及在Java中使用protobuf将对象进行序列化与反序列化示例代码.rar

    Netty提供了ChannelHandlerContext对象的writeAndFlush()方法,可以直接将ProtoBuf序列化的字节流写入网络通道。在接收端,可以使用ByteBuf的readBytes()方法获取字节流,然后反序列化为对象。 **总结** ProtoBuf...

    protobuf c++库

    protobuf c++库是Google开发的一种高效、灵活的数据序列化协议,用于在不同的数据结构和语言之间交换结构化数据。它的全称是Protocol Buffers,是一种跨平台、跨语言的序列化框架,旨在替代XML和JSON等传统数据交换...

    zeromq和protobuf的c++示例代码适合初学者快速了解,上手

    通过学习这个示例,你可以掌握如何在C++中创建zeromQ客户端和服务端,以及如何使用protobuf定义消息类型和进行数据序列化。这将对你的后端开发技能有很大提升,因为这两个工具在现代分布式系统中被广泛使用。

    protobuf vs2019 c++ 示例 代码

    3. **使用生成的类**:在C++代码中,你可以创建protobuf消息对象,填充数据,然后序列化成字节流,也可以从字节流反序列化回消息对象。例如: ```cpp Person person; person.set_name("John Doe"); person.set_...

    protobuf-3.5.1 c++ inclue,lib,dll,代码

    3. 生成代码:使用protobuf编译器protoc将.proto文件转换为C++源代码,这些源代码包含了序列化和反序列化的方法。 4. 集成到项目:将生成的源代码添加到你的C++项目中,然后就可以在代码中使用protobuf的数据结构了...

Global site tag (gtag.js) - Google Analytics