最近因爲項目須要,大體研究了一下protobuf的java使用。說實話,習慣了C++的protobuf,java用起來真彆扭。java
java在mongodb中的存儲其實很是方便,假設有定義一個proto,以下所示:mongodb
message User { required int64 id = 1; required string name = 2; }
那麼能夠利用一下代碼,對protobuf進行存儲數據庫
// 設置user User.Builder builder = User.newBuilder(); builder.setId(123); builder.setName("abc"); // 實例化user User user = builder.build(); // 序列化成byte數組 byte[] ub = user.toByteArray(); // 與mongodb創建鏈接 MongoClient cli = new MongoClient("localhost", 2000); // 切換至user_info數據庫 DB db = cli.getDB("user_info"); // 選擇集合user DBCollection coll = db.getCollection("user"); // 插入更新數據 DBObject condition = new BasicDBObject(); condition.put("user_id", user.getId()); DBObject data = new BasicDBObject(); data.put("user_id", user.getId()); data.put("model", ub); // 第三個參數設置爲true,表示upsert coll.update(condition, data, true, false);
若是須要得到存儲的數據,可利用一下代碼:數組
DBCursor cur = coll.find(condition); while(cur.hasNext()) { DBObject obj = cur.next(); Binary m = (Binary)result.get("model"); byte[] xx = m.getData(); break; }
若是須要跨語言平臺獲取數據,這裏以C++爲例:ui
std::string content;std::auto_ptr<mongo::DBClientCursor> cursor = conn->query("user_info.user", query.obj()); while (cursor->more()) { mongo::BSONObj obj = cursor->next(); if (!obj.isEmpty() && obj.isValid()) { mongo::BSONElement elm = obj.getField("model"); int len = 0; const char *b = elm.binData(len); content.assign(b, len); ret = true; } break; }