使用 Protocol Buffer 进行 Java 序列化

2024-02-27

我想在 Java 应用程序中使用 protobuf 来促进序列化,并且我对 Google 网站上的这段引用有疑问

协议缓冲区和 O-O 设计 Protocol Buffer 类基本上是 哑数据持有者(如结构体 C++);他们的头等舱成绩不好 对象模型中的公民。如果你 想要添加更丰富的行为 生成的类,最好的方法 这是包装生成的协议 缓冲类中的 特定于应用程序的类。包装 协议缓冲区也是一个好主意 如果你无法控制 .proto 文件的设计(例如, 你正在重复使用另一个 项目)。在这种情况下,您可以使用 包装类来制作 界面更适合独特的 您的应用程序的环境: 隐藏一些数据和方法,暴露 便利功能等。您应该 切勿将行为添加到生成的 类通过继承它们。这 会破坏内部机制 不好的面向对象实践 反正。

from: http://code.google.com/apis/protocolbuffers/docs/javatutorial.html http://code.google.com/apis/protocolbuffers/docs/javatutorial.html

当它说包装创建的类时是什么意思?


观点1

您编写一个 .proto 文件并将其提供给生成 Builder 代码的 protoc。他们建议不要向生成的代码添加任何方法。如果您确实希望将一些自定义行为添加到生成的代码中,那么请编写您自己的类来包装生成的代码。

例如,我们假设协议生成的类是 MyMessageBuilder。您想要添加一个可以接受 XML 输入并吐出 protobuff 特定消息的方法。您将编写一个 XmlToMyMessageBuilder,如下所示。在 XmlToMyMessageBuilder 中,您的类正在包装生成的代码并添加来自 Xml() 的自定义行为。

public class XmlToMyMessageBuilder
{
    private final MyMessageBuilder protoBuilder;

    public MyMessage fromXml(byte[] input()
    {
        protoBuilder.setXXX();
    }
}

这是一个通用的良好编程原则。

视角2

通过提供中介,您还可以将代码从底层序列化机制中分离出来。这允许您以较低的影响切换序列化器实现(假设您想要序列化所有数据均为字符串格式的有效负载......其中带压缩的 JSON 序列化是更好的替代方案)。你可以做这样的事情

public interface MySerializer
{
    boolean serialize(MyDomainObject input);
}

public PBBasedSerializer implements MySerializer
{
    private final MyMessageBuilder protoBuilder;
    ...
}

public JsonBasedSerializer implements MySerializer
{
    private final JSONSerializer jsonSerializer;
    ...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Protocol Buffer 进行 Java 序列化 的相关文章

随机推荐

  • 使用 sox splice 淡入淡出一组音频文件

    我可以使用 SoX 连接和交叉淡入淡出两个音频文件 如下所示 sox file1 wav file2 wav outfile wav splice q soxi D file1 wav 0 5 其中 soxi 替换是获取 file1 的持续
  • 如何根据整数变量的值动态创建许多标签和文本框?

    当我们知道 n 的值时 例如单击 显示 按钮后 有什么方法可以动态创建和显示带有 n 个相应文本框的 n 个标签 如果有任何事情让您不明白我的问题 请告诉我 谢谢你 我正在使用 VS C Express 2010 Windows 窗体 我将
  • MSXML2.XMLHTTP 请求验证在 ASP Classic 中输入的 URL

    预先感谢您收到的任何帮助 我想让我们的客户端在文本字段中输入 URL 然后检查该 URL 是否存在并有效 我想检查 3 种可能的结果 状态 200 正常 状态 500 服务器错误 或者状态为 404 未找到页面 在 ASP classic
  • 如何修改此指令,以便一旦输入可见,除非单击 x,否则它不会被隐藏?

    http plnkr co edit fXo21LnphHZ3qWnuEMFt p preview http plnkr co edit fXo21LnphHZ3qWnuEMFt p preview 现在 如果您单击输入之外的任何位置 则
  • 在没有主机访问权限的情况下更改 DotNetNuke 中的

    我需要更改 DotNetNuke 网站的标题 我有管理员访问权限 但没有主机访问权限 我还可以通过FTP访问网站的文件目录 我可以更改索引页的标题吗 如果您正在谈论在 文档部分 您可以在页面设置中逐页进行设置 从全局角度来看 没有真正的方法
  • 检查在执行单元测试期间是否附加了调试器

    如果调试器附加到当前测试执行 是否有方法检查 JUnit 代码 在 NET C 中我知道这是可能的Debugger IsAttached 用例是在附加调试器时更改或完全禁用测试超时 因为如果您只有大约 15 秒 定义的超时 来调试测试 这会
  • 在 Java 中通过 CrossOrigin 注解或在 Spring-Config XML 中使用 Spring 属性

    我在Spring中使用CrossOrigin注释 现在我想将属性作为值注入到注释中 我无法让这个工作 现在我像这样访问我的财产 Value settings cors origin String cors origin 我想将此属性注入到
  • Bitbucket符号(箭头)含义

    箭头是什么意思 我对 git 或 bitbucket 并不陌生 但我认为我可能在最初的提交中搞砸了一些事情 我需要帮助来解决这个问题 我的本地存储库中的文件夹不是空的 而是将其拉到该文件夹 所在的另一个位置 是链接吗 不在我的本地仓库上 该
  • Angular NgRx - 继续轮询仅第一次调用的服务的效果

    我有一个应用程序 我刚刚添加了 NgRX 我希望使用效果来打开和关闭轮询 示例大纲 我跟着这个帖子 https bbonczek github io jekyll update 2018 03 01 polling with ngrx ht
  • Clickonce部署到多个环境

    我有一个 WPF 应用程序 想通过 ClickOnce 部署给我们的用户 我们有四种环境 系统测试 用户测试 并行生产和生产 每个都需要一个不同的配置文件 其中包含服务器名称和特定于环境的其他内容 因此它们不能全部使用相同的代码库 大部分代
  • AudioClip 的频率和音调关系 - Unity3D

    我正在尝试仅使用 6 个音频剪辑来重新创建吉他的完整音域 我在想有一种方法可以设置音频剪辑的频率 但audio Frequency仅返回基于压缩格式的音频频率 而不是实际的音调 我知道我可以阅读 GetSpectrumData 但该解决方案
  • 在 R 中,我们如何向 kable() 表添加重要性星星?

    使用knitr kable 函数通过rmarkdown创建 doc表 我们如何从给定的数据帧 df b 添加 重要性星星符号 i e cutpoints c 0 001 01 05 1 1 symbols c 接近存储在另一个数据帧 df
  • Spring Boot 单元测试自动装配

    我有以下课程 应用和配置类 package mypackage service import mypackage service util MyUtility import org springframework boot SpringAp
  • Charles proxY:在 https 上重写不起作用

    我正在使用 Charles Proxy 重写网站上的代码 只是为了测试客户的网站 重写适用于除 https 网站之外的所有网站 Charles 可以选择协议 http 或 https 但这也不起作用 每次重写都在 http 上运行良好 而不
  • Firebase 查询 - 嵌套数据

    我正在尝试查询 firebase 中的一些分层数据 我在弄清楚如何查询以下数据结构时遇到了一些困难 orgs KBFXBBEyvgtfqMvU4pi name ACME 123 owner K9IPqIUIuEFzLS0f Pe users
  • 如何测试 Django 测试用例中是否记录了特定日志消息?

    我想确保代码中的某个条件会导致日志消息写入 django 日志 我如何使用 Django 单元测试框架来做到这一点 是否有地方可以检查记录的消息 类似于检查已发送的电子邮件 我的单元测试扩展了django test TestCase 使用m
  • 可滚动弹性盒中的多种背景颜色

    我有一个flexbox flex direction row 具有 2 列内容和固定高度 我希望左栏和右栏分别有红色和蓝色背景 如果任一列溢出 则flexbox的滚动条出现 溢出的部分仍然是红色 蓝色 如果列的内容高度小于flexbox的高
  • 预取指令是否需要在退出之前返回结果?

    在最新的 Intel 和 AMD CPU 上 已执行但请求的行尚未到达指定缓存级别的预取指令是否仍会退出 也就是说 预取的退休是 阻塞 的 因为它看起来对于加载来说是 阻塞 的 还是非阻塞的 关于英特尔处理器 没有 Intel优化手册第7
  • Python 使读取 Excel 文件更快

    我制作了一个读取 Excel 文档并检查第一行是否包含 UPDATED 的脚本 如果是这样 它将整行写入具有相同选项卡名称的另一个 Excel 文档 我的Excel文档有23张纸 每张纸有1000行 现在需要15分钟以上才能完成 有没有办法
  • 使用 Protocol Buffer 进行 Java 序列化

    我想在 Java 应用程序中使用 protobuf 来促进序列化 并且我对 Google 网站上的这段引用有疑问 协议缓冲区和 O O 设计 Protocol Buffer 类基本上是 哑数据持有者 如结构体 C 他们的头等舱成绩不好 对象