import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Method; import com.google.protobuf.Message;
import com.google.protobuf.Message.Builder;
import com.yundaex.common.exception.WrappedReflectException; public class ProtobufUtils { public static <T> byte[] marshal(T graph) {
if(Message.class.isAssignableFrom(graph.getClass())) {
Message msg = ((Message)graph);
return msg.toByteArray();
} else {
throw new ProtobufParseException();
}
} @SuppressWarnings("unchecked")
public static <T> T unmarshal(InputStream inputStream,Class<T> clazz) {
Message instance = generateDefaultInstance(clazz);
Builder builder = null;
try {
builder = instance.newBuilderForType().mergeFrom(inputStream);
} catch (IOException e) {
throw new ProtobufParseException();
}
if (!builder.isInitialized()) {
// TODO which exception should be thrown here?
throw new ProtobufParseException();
}
return (T) builder.build();
} @SuppressWarnings("unchecked")
public static <T> T unmarshal(byte[] data,Class<T> clazz) {
Message instance = generateDefaultInstance(clazz);
Builder builder = null;
try {
builder = instance.newBuilderForType().mergeFrom(data);
} catch (IOException e) {
throw new ProtobufParseException();
}
if (!builder.isInitialized()) {
// TODO which exception should be thrown here?
throw new ProtobufParseException();
}
return (T) builder.build();
} private static <T> Message generateDefaultInstance(Class<T> instanceClass) {
if (Message.class.isAssignableFrom(instanceClass)) {
try {
Method method = instanceClass.getMethod("getDefaultInstance", new Class[0]);
return (Message) method.invoke(null, new Object[0]);
} catch (Exception ex) {
throw new WrappedReflectException();
}
} else {
throw new WrappedReflectException();
}
}
}

ProtobufUtils的更多相关文章

  1. Scut:脚本引擎

    Scut 可以执行 C#.Python.Lua 三种类型的脚步,Scut 是如何加载并传递参数的呢? 首先值得注意的是:Scut 在编译时就会将逻辑层脚本源码复制到bin/Script的目录下. 1. ...

  2. Scut游戏server引擎Unity3d访问

    Scut提供Unity3d Sdk包.便利的高速发展和Scut游戏server对接: 看Unity3d示为以下的比率: 启动Unity3d项目 打开Scutc.svn\SDK\Unity3d\Asse ...

  3. 得到RequestVO

    import java.io.IOException; import java.nio.charset.Charset; import javax.servlet.ServletInputStream ...

  4. Scut游戏服务器引擎之Unity3d接入

    Scut提供Unity3d Sdk包,方便开发人员快速与Scut游戏服务器对接: 先看Unity3d示例如下: 启动Unity3d项目 打开Scutc.svn\SDK\Unity3d\Assets目录 ...

  5. Dubbo 在跨语言和协议穿透性方向的探索:支持 HTTP/2 gRPC

    Dubbo 在跨语言和协议穿透性方向上的探索:支持 HTTP/2 gRPC 和 Protobuf 本文整理自刘军在 Dubbo 成都 meetup 上分享的<Dubbo 在多语言和协议穿透性方向 ...

  6. 使用protobuf-java-format包 JsonFormat转Json部分默认值字段消失问题

    使用protobuf-java-format包 JsonFormat转Json部分默认值字段消失问题 1.产生的bug XXXXXXXXRequest.Builder request = XXXXXX ...

随机推荐

  1. bzoj 4817: [Sdoi2017]树点涂色 LCT+树链剖分+线段树

    题目: Bob有一棵n个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同. 定义一条路径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色. Bob可能会进 ...

  2. django models class 不识别问题解决方案

    目录 1. 事情起因 2. 排查经过 3. 总结 1. 事情起因 今天在写代码的时候,在django 的models目录中新增了一个pkg.py文件,里面定义了一个class, 在执行 makemig ...

  3. bzoj 3083 遥远的国度 —— 树链剖分

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3083 换根后路径还是不变,子树分类讨论一下,树剖后线段树维护即可. 代码如下: #inclu ...

  4. form+iframe实现ajax文件上传

    在做文件上传时除了传入文件外,还有附件参数,并且要求不刷新页面,之前是表单提交的方式,现在修改成ajax上传的方式,由于没有选择用插件,所以用form+iframe的方式,并且这种方式对IE8以上及主 ...

  5. Poj 1860 Currency Exchange(Bellman-Ford,SPFA解单源最短路径问题)

    一.题意 有多个货币交易点,每个只能互换两种货币,兑换的汇率不同,并收取相应的手续费.有N种货币,假定你拥有第S中,数量为V,有M个兑换点.问你能不能通过兑换操作使你最后拥有的S币比起始的时候多. 二 ...

  6. ORM查询相关

    一.多对多的正反向查询 class Class(models.Model): name = models.CharField(max_length=32,verbose_name="班级名& ...

  7. 共有11款Python 中文分词库开源软件

    件过滤: 排序: 收录时间 | 浏览数 Python 中文分词库 Yaha "哑哈"中文分词,更快或更准确,由你来定义.通过简单定制,让分词模块更适用于你的需求. "Ya ...

  8. hive sql 查询 Child Error 错误追究

    Diagnostic Messages for this Task: java.lang.Throwable: Child Error         at org.apache.hadoop.map ...

  9. linux 安装 elasticsearch

    安装 Java 8 当你提前在使用 Elasticsearch,你开始寻找更好的 Java 性能和兼容性时,您可以选择安装 Oracle 的专有 Java (Oracle JDK 8). 将 Orac ...

  10. Hive与Hbase结合使用

    hive的启动需要使用到zookeeper, 所以, 要么自己搭建zookeeper, 要么跟其它东西一起使用, 我这里做的是跟hbase一起使用的zookeeper, 因为hbase自带zookee ...