ProtobufUtils
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的更多相关文章
- Scut:脚本引擎
Scut 可以执行 C#.Python.Lua 三种类型的脚步,Scut 是如何加载并传递参数的呢? 首先值得注意的是:Scut 在编译时就会将逻辑层脚本源码复制到bin/Script的目录下. 1. ...
- Scut游戏server引擎Unity3d访问
Scut提供Unity3d Sdk包.便利的高速发展和Scut游戏server对接: 看Unity3d示为以下的比率: 启动Unity3d项目 打开Scutc.svn\SDK\Unity3d\Asse ...
- 得到RequestVO
import java.io.IOException; import java.nio.charset.Charset; import javax.servlet.ServletInputStream ...
- Scut游戏服务器引擎之Unity3d接入
Scut提供Unity3d Sdk包,方便开发人员快速与Scut游戏服务器对接: 先看Unity3d示例如下: 启动Unity3d项目 打开Scutc.svn\SDK\Unity3d\Assets目录 ...
- Dubbo 在跨语言和协议穿透性方向的探索:支持 HTTP/2 gRPC
Dubbo 在跨语言和协议穿透性方向上的探索:支持 HTTP/2 gRPC 和 Protobuf 本文整理自刘军在 Dubbo 成都 meetup 上分享的<Dubbo 在多语言和协议穿透性方向 ...
- 使用protobuf-java-format包 JsonFormat转Json部分默认值字段消失问题
使用protobuf-java-format包 JsonFormat转Json部分默认值字段消失问题 1.产生的bug XXXXXXXXRequest.Builder request = XXXXXX ...
随机推荐
- bzoj 3307: 雨天的尾巴 线段树合并
题目大意: N个点,形成一个树状结构.有M次发放,每次选择两个点x,y对于x到y的路径上(含x,y)每个点发一袋Z类型的物品.问完成所有发放后,每个点存放最多的是哪种物品. 题解: 首先我们为每一个节 ...
- BZOJ2563阿狸和桃子的游戏
2563: 阿狸和桃子的游戏 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 952 Solved: 682[Submit][Status][Discu ...
- 【Lintcode】364.Trapping Rain Water II
题目: Given n x m non-negative integers representing an elevation map 2d where the area of each cell i ...
- 洛谷【P1090】合并果子&&洛谷【P1334】瑞瑞的木板
浅谈堆:https://www.cnblogs.com/AKMer/p/10284629.html 合并果子题目传送门:https://www.luogu.org/problemnew/show/P1 ...
- 在Eclipse中用JDBC连接Mysql数据库
一.配置要求 JDK(下载http://www.oracle.com/technetwork/java/javase/downloads/index.html) Mysql(下载http://www. ...
- node.js的国内源
node.js在使用npm安装包是,由于源是国外的,有可能会被GFW屏蔽. 通过下面的方法可以把源指向国内的. 具体方法如下: 编辑 ~/.npmrc 加入下面内容 registry = http:/ ...
- Activity--弹出底部窗口
第一步 : 退出时候的布局文件exit_dialog_from_settings.xml <?xml version="1.0" encoding="UTF-8&q ...
- [51nod1272]最大距离(贪心)
解题关键:对num进行排序,从前往后扫id,及时更新 #include<cstdio> #include<cstring> #include<algorithm> ...
- 第五课5、ROS客户端2
1.简单的主题(topic)发布者和主题订阅者: 编写主题发布者节点需要: a.初始化ROS系统: b.广播消息:在foo主题上发布Foo_type_msg类型的消息 c.指定频率发布消息到foo主题 ...
- charles解决相应乱码问题
Charles.ini 文件手动添加vmarg.5=-Dfile.encoding=UTF-8