- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我能够编写代码来反序列化包含一个部分的原型(prototype)消息,而不必事先知道该部分包含什么。我不知道如何编写一组类似的结构定义,我可以使用 Cereal 以相同的方式反序列化。
我正在使用 Protobufs 序列化/反序列化一些数据,但我遇到了 the same problem as piaoxu .所以我转而使用 Cereal。
我已经能够将所有原始原型(prototype)定义转换为可以使用 Cereal 序列化的 C++ 结构定义,但使用 oneof 功能的原型(prototype)定义除外。
这是我想转换为结构的原型(prototype)定义的示例集:
syntax = "proto3";
package Messages;
message A {}
message B {}
message Message {
oneof contents {
A a = 1;
B b = 2;
}
}
这是我编写的用于反序列化和解析接收到的 Message
的相应 C++ 代码。使用生成的 protobuf 代码,我能够反序列化 Message
,而无需事先知道它是否包含 A
或 B
:
void ParseData(const string& data) {
{
auto message = new Messages::Message();
message->ParseFromString(data);
switch (message->contents_case()) {
case Messages::Message::kA:
std::cout << "I got an A!" << std::endl;
break;
case Messages::Message::kB:
std::cout << "I got a B!" << std::endl;
break;
default:
break;
}
}
这是我尝试制作一组等效的结构定义:
struct A {};
struct B {};
template <class Contents>
struct Message {
enum Type {
A,
B,
};
Type type;
Contents contents;
template <class Archive>
void serialize(Archive& archive) {
archive(type, contents);
}
};
我正在使用这些结构来序列化和发送消息,如下所示:
bool SendA() {
Message<A> message{};
ostringstream stream;
message.type = Message::Type::A;
message.contents = new A{};
{
cereal::PortableBinaryOutputArchive archive(stream);
archive(message);
}
return SendData(stream.str());
}
在我尝试反序列化收到的 Message
之前,此方法一直有效。我希望能够反序列化 Message
而无需 首先知道它是否包含 A
或 B
,但 AFAIK 这是不可能的。
使用我当前的方法确实不可能吗?如果是这样,是否有另一种方法可以让我在不知道它包含什么的情况下反序列化一组类似的结构?
最佳答案
与 Igor's comment , 我能够在不知道它包含什么的情况下将 Message
结构更改为可反序列化:
struct A {};
struct B {};
struct Message {
enum Type {
A,
B,
};
Type type;
unique_ptr<::A> a = nullptr;
unique_ptr<::B> b = nullptr;
template <class Archive>
void serialize(Archive& archive) {
archive(type, contents);
}
};
诀窍是不要让 Message
结构成为模板。
我编写 Message
结构的第一种方法是包含模板化的成员变量 contents
用于存储每个可能的内部结构(A
或B
)。这需要您知道序列化的 Message
结构包含什么,在您可以反序列化它之前,因为您必须首先创建专门的 Message
变量将数据反序列化为。
相反,您可以为每个可能的内部数据结构创建一个 unique_ptr
。这允许您创建一个未模板化的 Message
结构,并且您不必创建专门的 Message
变量来反序列化数据。
关于c++ - 能否使用 Cereal 重新创建 Protobuf 的反序列化功能之一?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56924828/
我正在尝试使用图像处理工具(如Python中的OpenCV)将颗粒分类为有缺陷的和无缺陷的。图像之一如图所示。 我首先通过使用HSV空间进行测距来分别对 Cereal 进行分割,并应用了一些边缘检测算
我知道在 Haskell 中序列化和反序列化数据的两个主要竞争包是二进制和谷类。什么时候应该选择其中一个包而不是另一个包?还是我忽略了其他选择? 最佳答案 它们不是竞争,它们是互补的。 cereal在
我正在尝试在笔记本电脑中运行grails,已经安装了jdk 1.8.0和jre8,我已经正确设置了JAVA_HOME和GRAILS_HOME。当我在命令提示符下键入%JAVA_HOME%或%GRAIL
我有一个现有的域, Controller , View (为后者自动生成),可以在浏览器中正常工作。 如果我具有... / user / show / 1或... / user / show的URL,
我有一个grails项目,当我提交它并将其推送到bitbucket远程时,在我注意到的bitbucket中,没有推送taglib,utils,services文件夹。问题是什么?该文件夹中没有文件。但
几个星期以来一直是一个问题,没有人设法解决这个问题。 当我填充数据库时,我通过读取并解析一个Excel工作表来做到这一点。 为每条线创建一个产品 域: class Product { St
我正在尝试将OpenRDF Sesame的核心库导入Grails应用程序。 这是我的BuildConfig.groovy文件的摘录: repositories { inherits true
我在Grails应用程序中有两个域,具有一对多关系:Course和Person。一门类(class)可能有很多人。当我查看针对类(class)的show.gsp时,它将显示该类(class)注册的所有
我有一个关于在Java脚本函数中使用remoteFunction组件的问题;我正在使用Grails 1.3.7。 我的页面上有几个div,其中包含我要更新的div。我要更新的每个div都有自己的ID(
我正在使用Grails -2.0.1,并且尝试运行应用程序时,我发现了NoClassDefFoundError: 错误2012-10-16 15:24:25,301 [http-bio-8080-ex
我发现了一个特定的 100MB bin 文件(在最小示例中为 CarveObj_k5_rgbThreshold10_triangleCameraMatches.bin),其中 Cereal 无法加载抛
我应该如何继续序列化嵌套对象? 例子: class B { public: int y; template void serialize(Archive& ar) {
我不知道为什么在尝试编译时会出现此错误。我尝试添加几乎所有类型。我正在尝试序列化一组 RegDoneEntry 的 .我知道序列化的调用不在这里,但我不能超越这个。以下内容已更新以反射(reflect
我对 Cereal 很陌生,我有一个(可能很简单的)问题: 当我不知道 (XML) 存档中的对象数量时,有没有办法反序列化多个对象? 我试过类似的方法: std::ifstream is("c:\\d
我在 VS 2013 中使用 Cereal 1.1.2。 我已经尝试使用此处的类型进行存档特化的示例:http://uscilab.github.io/cereal/archive_specializ
我在序列化多态类型时遇到问题。实际上,我只是将示例拆分为:http://uscilab.github.io/cereal/polymorphism.html在几个文件中。它编译得很好但在运行时我得到一
编辑:问题标题是基于对我得到的编译器错误的深刻误解。我(愚蠢地)假设错误是,我试图反序列化到我在函数内部声明的对象。这是完全错误的。我自己没有做足够的调试工作,否则我本可以找出问题所在。所以标题很误导
好吧,我在 C++11 中遇到了 Cereal 问题 (http://uscilab.github.io/cereal/)。 在抽象意义上,我有一个大图,我正在用许多连接边和顶点的共享指针对其进行序列
我在几种序列化协议(protocol)之间做了一些性能比较,包括FlatBuffers,Cap'n Proto,Boost序列化和谷类。所有测试都是用C++编写的。 我知道FlatBuffers和Ca
我试图遍历索引 View 中的字段列表。可以说我将以下内容传递给index.gsp: [SomeDomainList: SomeDomain.list(), fields: ['field1', 'f
我是一名优秀的程序员,十分优秀!