Ⅰ protocol buffer能支持java object 类型吗
对于每个字段而言都有一个修饰符(required/repeated/optional)、字段类型(bool/string/bytes/int32等)和字段标签(Tag)组成。
Ⅱ 怎样把json转为protocol buffer
例子:
package org.protob;
import org.protob.W.helloworld;
import com.google.protobuf.;
import com.googlecode.protobuf.format.JsonFormat;
import com.googlecode.protobuf.format.JsonFormat.ParseException;
/**
* 下载 protoc-2.5.0-win32.zip
* cmd: protoc.exe --java_out=./ w.proto
* @author liangrui
*
*/
public class Main {
public static void main(String[] args) throws Exception {
main2(null);
main3(null);
main4(null);
}
//序列化 /返序列化
public static void main2(String[] args) throws {
//序列化
helloworld.Builder builder=helloworld.newBuilder();
builder.setId(10);
builder.setStr("fx");
builder.setOpt(20);
helloworld info=builder.build();
byte[] result=info.toByteArray() ;
//返序列化
helloworld msg = helloworld.parseFrom(result);
System.out.println(msg);
}
//protobuf转json
public static void main3(String[] args) throws {
//序列化
helloworld.Builder builder=helloworld.newBuilder();
builder.setId(10);
builder.setStr("fx");
builder.setOpt(20);
helloworld info=builder.build();
byte[] result=info.toByteArray() ;
//返序列化
helloworld hello = helloworld.parseFrom(result);
System.out.println(hello);
String jsonFormat =JsonFormat.printToString(hello);
System.out.println(jsonFormat);
}
//josn转protobuf
public static void main4(String[] args) throws ParseException {
helloworld.Builder builder =helloworld.newBuilder();
String jsonFormat = "{id:11,str:'xxx',opt:50}";
JsonFormat.merge(jsonFormat, builder);
System.out.println(builder.build());
}
}
/**
output:
id: 10
str: "fx"
opt: 20
id: 10
str: "fx"
opt: 20
{"id": 10,"str": "fx","opt": 20}
id: 11
str: "xxx"
opt: 50
*/
proto文件 w.proto
package org.protob;
message helloworld
{
required int32 id = 1; // ID
required string str = 2; // str
optional int32 opt = 3; //optional field
}
生成后的java类
// Generated by the protocol buffer compiler. DO NOT EDIT!
// source: w.proto
package org.protob;
public final class W {
private W() {}
public static void registerAllExtensions(
com.google.protobuf.ExtensionRegistry registry) {
}
public interface helloworldOrBuilder
extends com.google.protobuf.MessageOrBuilder {
// required int32 id = 1;
/**
* <code>required int32 id = 1;</code>
*
* <pre>
* ID
* </pre>
*/
boolean hasId();
/**
* <code>required int32 id = 1;</code>
*
* <pre>
* ID
* </pre>
*/
int getId();
// required string str = 2;
/**
* <code>required string str = 2;</code>
*
* <pre>
* str
* </pre>
*/
boolean hasStr();
/**
* <code>required string str = 2;</code>
*
* <pre>
* str
* </pre>
*/
java.lang.String getStr();
/**
* <code>required string str = 2;</code>
*
* <pre>
* str
* </pre>
*/
com.google.protobuf.ByteString
getStrBytes();
// optional int32 opt = 3;
/**
* <code>optional int32 opt = 3;</code>
*
* <pre>
*optional field
* </pre>
*/
boolean hasOpt();
/**
* <code>optional int32 opt = 3;</code>
*
* <pre>
*optional field
* </pre>
*/
int getOpt();
}
/**
* Protobuf type {@code org.protob.helloworld}
*/
public static final class helloworld extends
com.google.protobuf.GeneratedMessage
implements helloworldOrBuilder {
// Use helloworld.newBuilder() to construct.
private helloworld(com.google.protobuf.GeneratedMessage.Builder<?> builder) {
super(builder);
this.unknownFields = builder.getUnknownFields();
}
private helloworld(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }
private static final helloworld defaultInstance;
public static helloworld getDefaultInstance() {
return defaultInstance;
}
public helloworld getDefaultInstanceForType() {
return defaultInstance;
}
private final com.google.protobuf.UnknownFieldSet unknownFields;
@java.lang.Override
public final com.google.protobuf.UnknownFieldSet
getUnknownFields() {
return this.unknownFields;
}
private helloworld(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf. {
initFields();
int mutable_bitField0_ = 0;
com.google.protobuf.UnknownFieldSet.Builder unknownFields =
com.google.protobuf.UnknownFieldSet.newBuilder();
try {
boolean done = false;
while (!done) {
int tag = input.readTag();
switch (tag) {
case 0:
done = true;
break;
default: {
if (!parseUnknownField(input, unknownFields,
extensionRegistry, tag)) {
done = true;
}
break;
}
case 8: {
bitField0_ |= 0x00000001;
id_ = input.readInt32();
break;
}
case 18: {
bitField0_ |= 0x00000002;
str_ = input.readBytes();
break;
}
case 24: {
bitField0_ |= 0x00000004;
opt_ = input.readInt32();
break;
}
}
}
} catch (com.google.protobuf. e) {
throw e.setUnfinishedMessage(this);
} catch (java.io.IOException e) {
throw new com.google.protobuf.(
e.getMessage()).setUnfinishedMessage(this);
} finally {
this.unknownFields = unknownFields.build();
makeExtensionsImmutable();
}
}
public static final com.google.protobuf.Descriptors.Descriptor
getDescriptor() {
return org.protob.W.internal_static_org_protob_helloworld_descriptor;
}
protected com.google.protobuf.GeneratedMessage.FieldAccessorTable
internalGetFieldAccessorTable() {
return org.protob.W.internal_static_org_protob_helloworld_fieldAccessorTable
.(
org.protob.W.helloworld.class, org.protob.W.helloworld.Builder.class);
}
public static com.google.protobuf.Parser<helloworld> PARSER =
new com.google.protobuf.AbstractParser<helloworld>() {
public helloworld parsePartialFrom(
com.google.protobuf.CodedInputStream input,
com.google.protobuf.ExtensionRegistryLite extensionRegistry)
throws com.google.protobuf. {
return new helloworld(input, extensionRegistry);
}
};
@java.lang.Override
public com.google.protobuf.Parser<helloworld> getParserForType() {
return PARSER;
}
Ⅲ 如何使用JAVA查询Oracle数据库字符串
事件: 报表接口数据库突然无法连接 ,导致无法正常取数操作。 异常信息: Io 异常: Got minus one from a read call 分析: 数据库地址及其配置信息都为发生变化 , 经询问后得知数据库调整为集群工作方式 。 结果:1. 修改普通 JDBC 连接字符串为集群工作方式。 2. 接口中的 JDBC JAR文件不适合集群工作方式。 思维宽度: 1. JDBC JAR文件的选择, Classes12 到底是个啥玩意? 第一次听很晕 , 其实就是 oracle 数据库自带的 JDBC ,全名叫 classes12.jar 。 高手都这么忽悠人的! 常用JDBC JAR 信息 序号 常用JDBC驱动包 JDK 1.4 JDK 1.5 JDK 1.6 单例数据库 集群数据库 Class.forName 1 OracleJdbcDriver9i.jar 支持 支持 支持 支持 不支持 oracle.jdbc.OracleDriver 2 classes12.jar(oracle 92i) 支持 支持 支持 支持 不支持 oracle.jdbc.OracleDriver 3 ojdbc14.jar(oracle 92i) 支持 支持 支持 支持 不支持 oracle.jdbc.OracleDriver 4 classes12.jar(oracle 10G) 支持 支持 支持 支持 支持 oracle.jdbc.OracleDriver 5 ojdbc14.jar(oracle 10G) 支持 支持 支持 支持 支持 oracle.jdbc.OracleDriver 6 ojdbc5.jar 不支持 支持 支持 支持 支持 无需 Class.forName 加载 7 ojdbc6.jar 不支持 不支持 支持 支持 支持 无需 Class.forName 加载 序号1 : OracleJdbcDriver9i.jar 这就是我常用的 JDBC 驱动,本次肇事者 !出身不明 , 户口本 (MANIFEST.MF) 内容为空 ,初步分析为 oracle92i 时代产物。序号2, 3 : 系出同门 ,都为 oracle92i 自带 ,家庭住址: oracle/jdbc/libclasses12.jar 户口本信息:Specification-Title: “Oracle JDBC driver classes for use with JDK1.2 and JDK1.3”Specification-Version: “Oracle JDBC Driver version - 9.0.2.0.0”ojdbc14.jar 户口本信息:Specification-Title: “Oracle JDBC driver classes for use with JDK1.4”Specification-Version: “Oracle JDBC Driver version - 9.0.2.0.0”序号4,5 : oracle 10G 的产物 与 oracle 92i 最大的区别在于支持 集群查询。序号 6,7: ojdbc5.jar 支持 JDK 1.5 ,支持 JDBC 3.0 ojdbc6.jar 支持 JDK 1.6 ,支持 JDBC 4.0两者无需执行 Class.forName(“oracle.jdbc.OracleDriver”); 直接 DriverManager.getConnection( URL, USER, PWD) ; 就OK了。如果项目仅支持 JDK1.4 就不要妄动 , 选择序号 4 ,5 不二的选择 。如果项目支持 JDK1.5 以上 推荐 序号 6 ,7 研究一下新特性。 2. 集群工作方式 连接字符串…慎重选择连接之外的属性。 偷懒粘贴下代码 ! StringBuffer url = new StringBuffer();url.append(“jdbc:oracle:thin:@(description= (address_list =”);url.append(“(address=(protocol=tcp)(host=192.168.31.9)(port=1521))”);//根据自己情况继续追加集群信息,格式如下//bf.append(“(address=(protocol=tcp)(host=10.37.27.112)(port=1521))”);url.append(“(load_balance=yes)”); //load_balance=yes;表示是否负载均衡url.append(“)”); //address_list 结束url.append(“(connect_data =”);url.append(“(server = dedicated)”); //server = dedicated;表示专用服务器模式,可以去掉url.append(“(service_name=wangjj)”); //数据库服务名称url.append(“(failover_mode =”);url.append(“(type=session)”); //TYPE = SESSION表示当一个连接好的会话的实例发生故障,系统会自动将会话切换到其他可用的实例,前台应用无须再度发起连接,但会话正在执行的SQL 需要重新执行url.append(“(method=basic)”); //METHOD = BASIC表示初始连接就连接一个接点,彵还有个选项是preconnect,表示初始连接所有的接点url.append(“(retries=5)”); //RETRIES 重试次数url.append(“(delay=15)”); //DELAY 重试延迟 单位为秒url.append(“)”); //failover_mode 结束url.append(“)”); //connect_data 结束url.append(“)”); //description 结束
Ⅳ Java调用URL错误,报505
HttpURLConnection 请求中 参数中如果有 空格,请求则会 505错误
解决: 需要对有空格的参数 做URL编码处理。
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStreamReader;
importjava.net.MalformedURLException;
importjava.net.URL;
importjava.net.URLEncoder;
importsun.net.www.protocol.http.HttpURLConnection;
importcom.alibaba.fastjson.JSONObject;
{
="http://localhost:8080/agd-restful/services/restful/QueryService/queryData/*?queryParam=";
publicstaticvoidmain(String[]args)
{
JSONObjectobj=newJSONObject();
obj.put("XM","匡匡");
obj.put("BIRTHDAY",<spanstyle="color:#FF6666;">getURLEncoder</span>("1988-01-0100:00:00,1988-12-3000:00:00"));
Stringurls=targetURL+obj.toString();
requestRestServer(urls);
}
(Stringurl)
{
JSONObjectobj=newJSONObject();
try
{
URLrestServiceURL=newURL(url);
=(HttpURLConnection)restServiceURL.openConnection();
httpConnection.setRequestMethod("GET");
httpConnection.setRequestProperty("Accept","application/json");
httpConnection.setRequestProperty("Accept-Charset","UTF-8");
httpConnection.setRequestProperty("contentType","UTF-8");
if(httpConnection.getResponseCode()!=200){
thrownewRuntimeException(":"
+httpConnection.getResponseCode());
}
BufferedReaderresponseBuffer=newBufferedReader(newInputStreamReader(
(httpConnection.getInputStream()),"utf-8"));
Stringoutput="";
Stringresult="";
System.out.println("OutputfromServer: ");
while((output=responseBuffer.readLine())!=null){
//System.out.println(output);
result=output;
}
obj=JSONObject.parseObject(result);
System.out.println(obj.toString());
httpConnection.disconnect();
}catch(MalformedURLExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
returnobj;
}
@SuppressWarnings("deprecation")
<spanstyle="color:#FF6666;">(Stringdest)
{
returnURLEncoder.encode(dest);
}</span>
}
修改后 正常ok
Ⅳ 如何把protobuf从linuee卸载
你找到文件夹,删除或粉碎
可以用类似腾讯电脑管家的工具粉碎
打开腾讯电脑管家——工具箱——文件粉碎
打开腾讯电脑管家——工具箱——清理注册表
Ⅵ 基于protocol buffer 的java网络编程
ProtocolBuffer只是一个数据协议格式,你将ProtocolBuffer生成的二进制以流的形式发送到客户端或服务端即可
Ⅶ JAVA的常用的类库有哪些
一、日志相关类库
日志库是很常见的,因为你在每一个项目中都需要他们。打印日志是服务器端应用中最重要的事情,因为日志是你了解你的程序发生了什么的唯一途径。尽管JDK附带自己的日志库,但是还是有很多更好的选择可用,例如 Log4j 、 SLF4j 和 LogBack。
Java开发人员应该熟悉日志记录的利弊, 并且了解为什么SLF4J要比Log4J要好。
二、JSON解析库
在当今世界的web服务和物联网中(IoT),JSON已经取代了XML,成为从客户端到服务器传送信息的首选协议。有一个好消息和一个坏消息。坏消息 是JDK没有提供JSON库。好消息是有许多优秀的第三方库可以用来解析和创建JSON消息,如 Jackson 和 Gson
一个Java web开发人员应该熟悉Jackson 和 Gson这两种中的至少一种库。
三、单元测试库
单元测试技术的使用,是区分一个一般的开发者和好的开发者的重要指标。程序员经常有各种借口不写单元测试,但最常见的借口就是缺乏经验和知识。常见的单测框架有 JUnit , Mockito 和PowerMock 。
《2020最新Java基础精讲视频教程和学习路线!》
四、通用类库
有几个很好的第三方通用库可供Java开发人员使用,例如 Apache Commons 和 Google Guava 。我会经常在我的代码中使用这些通用类库,因为这些类库都是经过无数开发者实践过的,无论是实用性还是在性能等方面都是最佳的。
五、Http 库
我不是很喜欢JDK的一个重要原因就包括他们缺乏对HTTP的支持。虽然可以使用java.net包类,但是这和直接使用像 Apache HttpClient 和 HttpCore 等开源类库比起来麻烦太多了。
尽管JDK 9将开始HTTP 2.0,也对HTTP的支持做了优化,但是我还是强烈建议所有的Java开发人员熟悉流行的HTTP处理类库,例如HttpClient和HttpCore HTTP等库。
六、XML解析库
市面上有很多XML解析的类库,如 Xerces , JAXB , JAXP , Dom4j , Xstream 等。 Xerces2是下一代高性能,完全兼容的XML解析工具。Xerces2定义了 Xerces Native Interface (XNI)规范,并提供了一个完整、兼容标准的 XNI 规范实现。该解析器是完全重新设计和实现的,更简单以及模块化。
七、Excel读写库
许多应用程序需要提供把数据导出到Excel的功能,如果你要做相同的Java应用程序,那么你需要 Apache POI API 。
这是一个非常丰富的类库,你可以从Java程序读写XLS文件。
八、字节码库
如果你正在编写一个框架或者类库。有一些受欢迎的字节码库如 javassist 和 Cglib Nodep 可以供你选择,他们可以让你阅读和修改应用程序生成的字节码。
Javassist使得JAVA字节码操作非常简单。它是一个为编辑Java字节码而生的类库。 ASM 是另一个有用的字节码编辑库。
九、数据库连接池库
如果你的Java应用程序与数据库交互不是使用数据库连接池库的话,那么你就大错特错了。因为在运行时创建数据库连接非常耗时并且会拖慢你的程序。所以墙裂建议使用,有些好用的连接池可供选择,如 Commons Pool 和 DBCP 。
在web应用程序中,web服务器通常提供了这些功能。但是在java项目中需要把数据库连接池的类库导入到应用中。
十、消息传递库
像日志和数据库连接池一样,消息传递也是很多实际的Java项目中必备的。Java提供了JMS Java消息服务,但这不是JDK的一部分,你需要单独的引入jms.jar。类似地,如果您准备使用第三方消息传递协议, Tibco RV 是个不错的选择。
十一、PDF处理库
除了Excel和Word,PDF也是一种常用的文件格式。如果你的应用程序要支持PDF格式的文件处理,你可以使用 iText 和 Apache FOP 类库。两者都提供了非常有用的PDF处理功能。
十二、日期和时间库
在Java之前,JDK的日期和时间库一直被人们所诟病,比如其非线程安全的、不可变的、容易出错等。很多开发人员会选择更好用的 JodaTime 类库。
但是在Java8推出之后,我们就可以彻底放弃JodaTime了,因为Java 8提供了其所有功能。但是,如果你的代码运行在一个低版本的JDK中,那么JodaTime还是值得使用的。
十三、集合类库
虽然JDK有丰富的集合类,但还是有很多第三方类库可以提供更多更好的功能。如 Apache Commons Collections 、 Goldman Sachs collections 、 Google Collections 和 Trove 。Trove尤其有用,因为它提供所有标准Collections 类的更快的版本以及能够直接在原语(primitive)(例如包含int 键或值的Map 等)上操作的Collections 类的功能。
FastUtil是另一个类似的API,它继承了Java Collection Framework,提供了数种特定类型的容器,包括映射map、集合set、列表list、优先级队列(prority queue),实现了java.util包的标准接口(还提供了标准类所没有的双向迭代器),还提供了很大的(64位)的array、set、list,以及快速、实用的二进制或文本文件的I/O操作类。
十四、邮件API
javax.mail 和 Apache Commons Email 提供了发送邮件的api。它们建立在JavaMail API的基础上,提供简化的用法。
十五、HTML解析库
和XML与JSON类似,HTML是另外一种我们可能要打交道的传输格式。值得庆幸的是,我们有jsoup可以大大简化Java应用程序使用HTML。你不仅可以使用 JSoup 解析HTML还可以创建HTML文档。
十六、加密库
Apache Commons家族中的 Commons Codec 就提供了一些公共的编解码实现,比如Base64, Hex, MD5,Phonetic and URLs等等。
十七、嵌入式SQL数据库库
我真的是非常喜欢像 H2 这种内存数据库,他可以嵌入到你的Java应用中。在你跑单测的时候如果你需要一个数据库,用来验证你的SQL的话,他是个很好的选择。顺便说一句,H2不是唯一嵌入式DB,你还有 Apache Derby 和 HSQL 可供选择。
十八、JDBC故障诊断库
有不错的JDBC扩展库的存在使得调试变得很容易,例如P6spy,这是一个针对数据库访问操作的动态监测框架,它使得数据库数据可无缝截取和操纵,而不必对现有应用程序的代码作任何修改。 P6Spy 分发包包括P6Log,它是一个可记录任何 Java 应用程序的所有JDBC事务的应用程序。其配置完成使用时,可以进行数据访问性能的监测。
十九、序列化库
Google Protocol Buffer是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。目前提供了 C++、Java、Python 三种语言的 API。
二十、网络库
一些有用的网络库主要有 Netty 的和 Apache MINA 。如果您正在编写一个应用程序,你需要做的底层网络任务,可以考虑使用这些库。
这都是每位Java开发人员应该熟悉的,并且十分有用的库。Java生态系统非常庞大的,你会发现有很多不同的类库可以做不同的事情。每个你想到的东西,都可能有一个库可以做到。
要相信,你遇到的问题,肯定不止你一个遇到过。
要相信,也许有很多人比你更勤奋。
要相信,你用或不用,轮子就在那里。
要相信,使用这些类库,你和你的代码都会变得更好。
原文链接:https://blog.csdn.net/u011001084/article/details/79216958
Ⅷ Java的一段网络程序编写,请高手赐教!
1.Thread(this)就是构造线程的语句,start()是启动语句。
2.知道awt的事件处理不?还有内部类,感觉你应该不知道,去看看吧,你这程序都不知道怎么改。
Ⅸ google protocol buffer java怎么会有set方法
用来给类成员对象赋值的方法。 一个类对于其成员对象的管理一般比较安全的方法应当是将其内部成员对象设置为private属性(这样可以防止外部错误修改),然后提供相应的方法去操作内部成员对象。