- 浏览: 127597 次
- 性别:
- 来自: 上海
-
文章分类
最新评论
In one of my projects, I developed the Restful web service on Jersey and consume/produces Protobuf message. It all worked well until a new requirement came to add support of Javascript client. So, I added 4 more classes:
HextUtils
JsonFormat
JsonMessageReader
JsonMessageWriter
along with two existing classes
ProtobufMessageReader
ProtobufMessageWriter
now the web service can support both message formats. Just make sure to NOT have any media type explicitly defined in the web service classes – Jersey will pick up the correct reader/writer based on the incoming contest-type and accept headers.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import javax.ws.rs.Consumes;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.MessageBodyReader;
import javax.ws.rs.ext.Provider;
import com.google.protobuf.ExtensionRegistry;
import com.google.protobuf.GeneratedMessage;
@Provider
@Consumes(“application/json”)
public class JsonMessageReader implements MessageBodyReader {
public static String LS = System.getProperty(“line.separator”);
private ExtensionRegistry extensionRegistry = ExtensionRegistry
.newInstance();
@Override
public boolean isReadable(Class arg0, Type arg1, Annotation[] arg2,
MediaType mediaType) {
return mediaType.isCompatible(MediaType.APPLICATION_JSON_TYPE);
}
public T readFrom(Class type, Type genericType, Annotation[] annotations,
MediaType mediaType, MultivaluedMap httpHeaders,
InputStream entityStream) throws IOException, WebApplicationException {
try
{
Method newBuilder = type.getMethod(“newBuilder”);
GeneratedMessage.Builder builder = (GeneratedMessage.Builder) newBuilder.invoke(type);
String data = convertInputStreamToString(entityStream);
JsonFormat.merge(data, extensionRegistry, builder);
return (T) builder.build();
}
catch (Exception e)
{
throw new WebApplicationException(e);
}
}
private String convertInputStreamToString(InputStream io) {
StringBuffer sb = new StringBuffer();
try {
BufferedReader reader = new BufferedReader(
new InputStreamReader(io));
String line = reader.readLine();
while (line != null) {
sb.append(line).append(LS);
line = reader.readLine();
}
} catch (IOException e) {
throw new RuntimeException(“Unable to obtain an InputStream”, e);
}
return sb.toString();
}
}
import java.io.IOException;
import java.io.OutputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.MessageBodyWriter;
import javax.ws.rs.ext.Provider;
import com.google.protobuf.Message;
@Provider
@Produces(“application/json”)
public class JsonMessageWriter implements MessageBodyWriter {
@Override
public long getSize(T arg0, Class arg1, Type arg2, Annotation[] arg3,
MediaType arg4) {
return -1;
}
@Override
public boolean isWriteable(Class arg0, Type arg1, Annotation[] arg2,
MediaType mediaType) {
return mediaType.isCompatible(MediaType.APPLICATION_JSON_TYPE);
}
@Override
public void writeTo(T arg0, Class arg1, Type arg2, Annotation[] arg3,
MediaType arg4, MultivaluedMap arg5,
OutputStream outputStream) throws IOException, WebApplicationException {
outputStream.write(JsonFormat.printToString((Message) arg0).getBytes());
}
}
import java.io.IOException;
import java.io.InputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import javax.ws.rs.Consumes;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.MessageBodyReader;
import javax.ws.rs.ext.Provider;
import com.google.protobuf.GeneratedMessage;
import com.google.protobuf.Message;
/**
* Message Body Reader.
*/
@Provider
@Consumes(“application/x-protobuf”)
public class ProtobufMessageReader implements MessageBodyReader
{
public boolean isReadable(Class type, Type genericType,
Annotation[] annotations, MediaType mediaType)
{
return Message.class.isAssignableFrom(type);
}
public Message readFrom(Class type, Type genericType,
Annotation[] annotations, MediaType mediaType,
MultivaluedMap httpHeaders, InputStream entityStream)
throws IOException, WebApplicationException
{
try
{
Method newBuilder = type.getMethod(“newBuilder”);
GeneratedMessage.Builder builder = (GeneratedMessage.Builder) newBuilder.invoke(type);
return builder.mergeFrom(entityStream).build();
}
catch (Exception e)
{
throw new WebApplicationException(e);
}
}
}
import java.io.IOException;
import java.io.OutputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.MessageBodyWriter;
import javax.ws.rs.ext.Provider;
import com.google.protobuf.Message;
/**
* A Message Body Writer
*/
@Provider
@Produces(“application/x-protobuf”)
public class ProtobufMessageWriter implements MessageBodyWriter {
public boolean isWriteable(Class type, Type genericType, Annotation[] annotations,
MediaType mediaType) {
return Message.class.isAssignableFrom(type);
}
public long getSize(Message m, Class type, Type genericType, Annotation[] annotations,
MediaType mediaType) {
return m.getSerializedSize();
}
public void writeTo(Message m, Class type, Type genericType, Annotation[] annotations,
MediaType mediaType, MultivaluedMap httpHeaders, OutputStream entityStream) throws IOException,
WebApplicationException {
entityStream.write(m.toByteArray());
}
}
All credits go to the people who have contributed and open-sourced the protobuf and json projects.
发表评论
-
(转)JDK工具(查看JVM参数、内存使用情况及分析等)
2018-12-25 15:50 372https://www.cnblogs.com/z ... -
[转]jstat查看jvm的GC情况
2018-12-25 15:38 590jstat 1. jstat -gc pid ... -
转一个 jmap 的基本使用方法
2017-04-05 11:52 552原文:http://hbluojiahui.bl ... -
(转)JVM内存堆布局图解分析
2017-04-05 11:56 427转载原文出处:http://www.codeceo.com/ ... -
(转)系统吞吐量(TPS)、用户并发量、性能测试概念和公式
2017-03-27 11:19 471PS:下面是性能测试的主要概念和计算公式,记录下: 一.系 ... -
(转)深入理解Major GC, Full GC, CMS
2016-11-02 11:27 521原文:http://blog.csdn.net/iter_ ... -
(转)OpenSSL 1.0.0生成p12、jks、crt等格式证书的命令个过程
2016-07-26 18:51 699OpenSSL 1.0.0生成p12、jks、crt等格式 ... -
(转)Java 内存区域和GC机制
2016-07-26 14:09 385录 Java垃圾回收概况 Java内存区域 Java ... -
Understanding CMS GC Logs
2016-07-26 11:06 553Understanding CMS GC Logs By ... -
(转)Java动态代理机制详解(JDK 和CGLIB,Javassist,ASM)
2016-07-08 17:56 854源地址:http://blog.csdn.net/lu ... -
linux下查看最占性能的JAVA进程
2016-03-08 11:58 653记录一下自己常用的linux系统命令,方便以后查阅,发觉记忆 ... -
(转,精)Java 多线程 并发编程
2015-10-10 19:50 819源地址:http://blog.csdn.n ... -
java虚拟机内存监控工具jps,jinfo,Jstack,jstat,jmap,jhat使用
2015-09-21 13:14 1231源地址:http://my.oschina. ... -
(转)JMM模型
2014-11-11 16:53 503源地址:http://blog.csdn.net/gt ... -
(转)《深入浅出 Java Concurrency》目录
2014-11-10 15:55 427原文地址:http://www.blogjava.net/x ... -
(转)TCP/IP、Http、Socket的区别
2014-08-21 10:32 832源地址: http://jingyan.baidu.com/ ... -
(转)Swift里的CAP理论和NWR策略应用
2014-08-12 17:25 635源地址:http://blog.sina.com.cn/s/ ... -
(转)Java多线程编程的常见陷阱
2014-06-25 13:14 515源地址:http://developer.51cto.com ... -
(转)Java 正确的做字符串编码转换
2014-03-11 21:52 681原文:http://hi.baidu.com/sodarf ... -
深入理解java内存模型系列文章
2013-12-30 10:57 464深入理解java内存模型系列文章 源地址: htt ...
相关推荐
标题中的“实现protobuf与json的互转”是指在软件开发中,如何将使用Protocol Buffers(protobuf)编写的结构体数据转换成JSON格式,反之亦然。Protocol Buffers是Google推出的一种数据序列化协议,而JSON...
protobuf库提供了一个`json_format`模块,用于将protobuf消息转换为JSON字符串: ```python from google.protobuf.json_format import MessageToJson from example_pb2 import Person # 创建一个Person实例 person...
标题中的“protobuf转换为json”指的是将Protocol Buffers(protobuf)数据格式转换成JavaScript Object Notation(JSON)数据格式的过程。Protocol Buffers是Google开发的一种高效的数据序列化协议,常用于结构化...
protobuf-jsonschema 将编译为定义。 用法 您可以将protobuf-jsonschema用作命令行工具,或用作node中的函数。 CLI可以输出JSON或YAML(例如,用于Swagger)。 如果您指定一个protobuf消息名称以及一个文件,它将...
从Protobuf到JSON-Schema编译器这将采用protobuf定义并将其转换为JSONSchemas,可用于动态验证JSON消息。 对于使用ProtoBuf定义数据但将JSON用作“ wire”格式的人们很有用。 受到“重大影响”。安装注意:此工具...
本资源提供了一个基于protobuf反射特性的pb结构与json相互转换的实例,该实例程序主要有两个核心函数myMessage2Json、myJson2Message。前者的作用是将pb结构转换成对应的json,后者是将json转换成对应的pb结构体。...
在本项目中,我们主要探讨的是如何将Spring框架与Jersey和Google的Protocol Buffers(简称Protobuf)相结合,以构建一个RESTful Web服务。这是一个典型的企业级应用开发场景,其中Spring提供了强大的依赖注入和AOP...
标题“protojson:比较 JS 中 protobuf 和 JSON 编码的简单示例”暗示了我们将讨论如何在JavaScript环境中使用protobuf以及与JSON之间的差异。 首先,让我们了解什么是protobuf。Protocol Buffers是Google开发的一种...
在IT行业中,数据交换和序列化是一个关键环节,protobuf(Protocol Buffers)和JSON都是广泛使用的数据表示格式。protobuf是由Google开发的一种高效、结构化的数据序列化协议,而JSON则是一种轻量级的文本数据交换...
3. **API设计**: 在RESTful API中,protobuf作为消息格式可以提供高效的序列化和反序列化。 **六、protobuf工具链** 1. **protoc编译器**: 主要用于将.proto文件转换为目标语言的源代码。 2. **protobuf库**: 提供...
RESTful + Protobuf 该项目试图演示RESTful API对protobuf协议的用法。 该服务使用Go编写,并且使用Javascript和Ruby提供了两个客户端。 先决条件 码头工人 protoc(如果您想尝试编译protobuf文件) 试用代码 make ...
描述中提到的"如何创建,获得json字符串的方法封装成对象",是指将JSON操作封装成一个独立的对象或类库,便于在ProtoBuf开发Web服务时使用。这个库可能包含了序列化PB对象到JSON字符串,以及反序列化JSON字符串回PB...
为了高效地存储和传输数据,我们有多种序列化格式可供选择,其中最常见的是Protobuf(Protocol Buffers)和JSON(JavaScript Object Notation)。这两种格式各有优势,适用于不同的场景。本文将深入探讨它们的特性和...
可支持protobuf 与 json 的互转. 但必须protobuf生成时不能带lite.
在IT行业中,`pbjson`通常指的是Protocol Buffers(protobuf)序列化库生成的JSON(JavaScript Object Notation)格式的数据。Protocol Buffers是Google开发的一种数据序列化协议,用于高效地编码和解码结构化数据。...
ProtoBuf是由Google开发的一种高效的数据交换的序列化协议,而JSON则是一种轻量级的数据交换格式,广泛应用于Web服务和数据存储。 1. **ProtoBuf(Protocol Buffers)**: - ProtoBuf是一种二进制数据表示格式,它...
protobuf编译好的文件通常指的是Google开源的Protocol Buffers(简称protobuf)编译后的二进制库、头文件和源代码,这些文件已经过编译,可以直接在开发项目中使用,以实现数据序列化和反序列化的高效通信。protobuf...
标题“protobuf-for-with-python”指的是将Protocol Buffers(通常简称为Protobuf)与Python编程语言结合使用的主题。Protocol Buffers是Google开发的一种数据序列化协议,它允许开发者定义数据结构,然后生成能够在...
标题提到的"pb解析json工具"是一种专门用于处理protobuf(简称pb)与JSON两种数据格式相互转换的工具。这两种格式各有优势,广泛应用于不同场景。 首先,让我们了解一下JSON(JavaScript Object Notation)。JSON是...
7. **protobuf与JSON互操作**:protobuf提供JSON格式的支持,可以方便地在protobuf和JSON之间转换,满足不同的应用场景需求。 8. **性能优势**:protobuf的二进制格式通常比XML或JSON更小、解析更快,尤其是在传输...