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 4765: 普通计算姬 主席树+替罪羊树思想

    题目大意: 给定一棵\(n\)个节点的带权树有根树,设\(sum_p\)表示以点\(p\)为根的这棵子树中所有节点的权 计算姬支持下列两种操作: 给定两个整数\(u,v\),修改点\(u\)的权值为\ ...

  2. 【JSON解析】JSON解析

    前三篇博客分别介绍了xml的三种解析方法,分别是SAX,DOM,PULL解析XML,兴趣的朋友可以去看一下这[XML解析(一)]SAX解析XML,[XML解析(二)]DOM解析XML,[XML解析(三 ...

  3. delete操作符

    delete操作符通常用来删除对象的属性: Js代码     var o = { x: 1 }; delete o.x; // true o.x; // undefined 而不是一般的变量: Js代 ...

  4. Cloudera运维

    1. 增加一个节点 1. 拷贝cm的jar包到该节点 2. 设置hostname(hostnamectl set-hostname XXX),然后修改hosts文件 3. 所有的节点添加该hostna ...

  5. SSH不允许Root登陆的方法

    不允许Root登陆的方法如下: vim /etc/ssh/sshd_config 把PermitRootLogin yes 改成: PermitRootLogin no 然后重启sshd服务: Ser ...

  6. HDU1026(延时迷宫:BFS+优先队列)

    Ignatius and the Princess I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (J ...

  7. mysql: not unique table/alias error. 如何解决

    1.请检查出现问题位置的 SQL 语句中是否使用了相同的表名,或是定义了相同的表别名. 2.检查 SELECT 语句中要查询的字段名是不是定义重复,或者没有定义. 3.把你的sql语句中的换行去掉.一 ...

  8. 第三课 go语言基础语法

    http://www.runoob.com/go/go-basic-syntax.html 1 行分隔符 在 Go 程序中,一行代表一个语句结束.每个语句不需要像 C 家族中的其它语言一样以分号 ; ...

  9. net start sql server (instance)

    如何启动 SQL Server 实例(net 命令) 其他版本   可以使用 Microsoft Windows net 命令启动 Microsoft SQL Server 服务. 启动 SQL Se ...

  10. python超大数计算

    In [26]: %time a = 6789**100000CPU times: user 0 ns, sys: 0 ns, total: 0 nsWall time: 6.2 µsIn [27]: ...