通用的ProtostuffSerializer for Java

以前使用 protobuf或protostuff的時候覺得很麻煩,每個類都要單獨定制,于是封裝了一個類。

同事測試過,性能和壓縮率都很好,尤其是相比json的序列化。

需注意:只支持Pojo類(即需要有get/set方法)、對一個新的class第一次調用初始化會有一兩百毫秒的register時間,之后就很快了。

?

import io.protostuff.LinkedBuffer;
import io.protostuff.ProtostuffIOUtil;
import io.protostuff.Schema;
import io.protostuff.runtime.RuntimeSchema;import java.io.Serializable;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;/*** Protostuff serializer tool, for POJO serialization.* Protostuff is much more efficient than json, even faster than Protobuf and Avro, but the serialized string is human-unreadable.* Not support Array or Generic-type, please wrap these special objects via a POJO with empty constructors.** @author lhfcws* @since 2016-03-16*/
public class ProtostuffSerializer implements Serializable {static Map<Class, Schema> schemaCache = new ConcurrentHashMap<>();/*** common protostuff serialize, object need a empty constructor* Be careful to convert result byte[] to String, use new String(bytes, StandardCharsets.UTF_16LE).** @param obj* @param <T>* @return*/public static <T> byte[] serializeObject(T obj) {Class<T> klass = (Class<T>) obj.getClass();LinkedBuffer buffer = LinkedBuffer.allocate(4096);
try {
if (schemaCache.containsKey(klass)) {return ProtostuffIOUtil.toByteArray(obj, schemaCache.get(klass), buffer);} else {schemaCache.put(klass, RuntimeSchema.getSchema(klass));return ProtostuffIOUtil.toByteArray(obj, schemaCache.get(klass), buffer);}
} finally {
buffer.clear();
}}
/*** common protostuff unserialize** @param bs* @param klass* @param <T>* @return*/public static <T> T deserialize(byte[] bs, Class<T> klass) {if (schemaCache.containsKey(klass)) {Schema<T> schema = schemaCache.get(klass);T msg = schema.newMessage();ProtostuffIOUtil.mergeFrom(bs, msg, schema);return msg;} else {Schema<T> schema = RuntimeSchema.getSchema(klass);T msg = schema.newMessage();schemaCache.put(klass, schema);ProtostuffIOUtil.mergeFrom(bs, msg, schema);return msg;}} }

?

使用demo:

// 如果是Pojo類直接調用就行了,非Pojo類參考如下:(假設已有一個StrParams model類)public static class StrParamsPojo {private StrParams p;public StrParamsPojo() {}public StrParamsPojo(StrParams p) {this.p = p;}public StrParams getP() {return p;}public void setP(StrParams p) {this.p = p;} }public void serialize() throws IOException {StrParams p = new StrParams();StrParamsPojo pojo = new StrParamsPojo(p);byte[] bs = ProtostuffSerializer.serializeObject(pojo);}public void deserialize(byte[] bs) throws IOException {StrParamsPojo pojo = ProtostuffSerializer.deserialize(bs, StrParamsPojo.class);StrParams p = pojo.getP();}

?

附送一個FastJsonSerializer:

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;import java.lang.reflect.Type;/*** FastJson is faster than Gson.* But DO remember your objects has get/set for the fields you want to serialze.* @author lhfcws*/
public class FastJsonSerializer {/*** 把給定的對象序列化成json字符串* @param obj 給定的對象* @return 對象序列化后的json字符串*/public static <T> String serialize(T obj) {return JSON.toJSONString(obj,SerializerFeature.IgnoreNonFieldGetter,SerializerFeature.SkipTransientField,SerializerFeature.DisableCircularReferenceDetect,SerializerFeature.BrowserCompatible);}public static <T> String serializePretty(T obj) {return JSON.toJSONString(obj,SerializerFeature.IgnoreNonFieldGetter,SerializerFeature.SkipTransientField,SerializerFeature.DisableCircularReferenceDetect,SerializerFeature.BrowserCompatible,SerializerFeature.PrettyFormat);}/*** 根據類名把json字符串反序列化成實體類對象* @param json 待反序列化的json字符串* @param klass 反序列化的實體類* @return 反序列化后的對象*/public static <T> T deserialize(String json, Class<T> klass) {return JSON.parseObject(json, klass);}/*** 把Json字符串反序列化成實現了Type接口的實體類對象* @param json 待反序列化的json字符串* @param type 泛型類型* @return 反序列化后的對象*/public static <T> T deserialize(String json, Type type) {return JSON.parseObject(json, type);}
}

?

轉載于:https://www.cnblogs.com/lhfcws/p/6296725.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/371647.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/371647.shtml
英文地址,請注明出處:http://en.pswp.cn/news/371647.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SAS筆記(6) PROC MEANS和PROC FREQ

PROC MEANS和PRC FREQ在做描述性分析的時候很常用&#xff0c;用法也比較簡單&#xff0c;不過這兩個過程步的某些選項容易忘記&#xff0c;本文就梳理一下。 在進入正文前&#xff0c;我們先創建所需的數據集TEST_SCORES&#xff1a; DATA TEST_SCORES; INPUT COUNTY : $9. SC…

休眠:保存vs持久并保存或更新

save和saveOrUpdate之間的區別是什么或save和persist之間的區別是任何Hibernate面試中常見的面試問題&#xff0c;就像Hibernate中get和load方法之間的區別一樣。 Hibernate Session類提供了幾種通過save &#xff0c; saveOrUpdate和persist等方法將對象保存到數據庫中的方法。…

php搜索數據庫設計,PHP數據庫搜索功能設計

其實搜索功能的設計很簡單&#xff0c;幾行代碼就可以完成。下面是form表單。從表單發出的數據名為search&#xff0c;然后發送到../admin/article_SearchResult.php這個文件處理。下面講下article_SearchResult.php這個文件如何實現搜索。$searchs $_POST[‘search‘];?>…

2016 Android Top 10 Library

過去的 2016 年&#xff0c;開源社區異常活躍&#xff0c;很多個人與公司爭相開源自己的項目&#xff0c;讓人眼花繚亂&#xff0c;然而有些項目只是曇花一現&#xff0c;有些項目卻持久創造價值&#xff0c;為開發者提供了極大的便利&#xff0c;這些終究由時間來判斷。今天&a…

集成JavaFX和Swing

我剛剛完成了對使用Swing的應用程序組件的重寫&#xff0c;現在正在使用JavaFX&#xff0c;最后得到了與更大的swing應用程序集成的JavaFX組件。 這是一個很大的應用程序&#xff0c;重寫花了我一段時間&#xff0c;最后一切都很好&#xff0c;我很高興自己做到了。 您可能想在…

提示錯誤:“應為“providerInvariantName”參數的非空字符串。”

我在調試Petapoco的T4模版的時候&#xff0c;鏈接一直報如題那個錯誤。在定性問題為配置文件后找的原因如下&#xff1a; <connectionStrings><add name"這個不行" connectionString"Data Sourcexxx;Initial Catalog數據庫名;User ID帳號;Password密碼…

php oop面試題,PHP面試題 - 對面向對象的理解

具體的題目應該是&#xff1a;什么是面向對象&#xff1f;主要的特征是什么&#xff1f;當然還有很多類似的題目&#xff0c;如果你說一下你對面向對象的理解&#xff0c;或者是你對比一下面向過程等等&#xff0c;諸如此類吧&#xff1f;如果我來回答這個問題&#xff0c;我會…

NOIP2014自測(晚自習兩節+上午兩節 共5個小時)

昨天剛剛考完試然后就翹晚自習跟今天上午兩節課的語文和英語做做noip2014的題目。然后去評測了一番。首先day1day2的t1基本都是模擬&#xff0c;一看就出思路那種&#xff0c;直接ac掉。代碼如下 day1t1&#xff1a;#include<iostream>#define maxn 209using namespace s…

您在eXo平臺上的第一個Juzu Portlet

菊珠是佛教的佛珠。 一句話&#xff0c;我相信您已經學到了什么&#xff0c;印象深刻嗎&#xff1f; 好的&#xff0c;我在這里不談論佛教。 Juzu還是一個用于快速開發Portlet&#xff08;以及即將推出的獨立應用程序&#xff09;的新框架。 您可以在Juzu網站上找到所需的所有…

Spring注入方式及注解配置

一&#xff1a;基于xml的DI&#xff08;Dependency Injection&#xff09; 注入類型&#xff1a; 定義學生Student實體類和小汽車Car實體類&#xff1a;進行封裝和生成ToString(),并自定義屬性Car Student 123456789101112131415161718192021222324252627282930313233343536373…

java 切面 不執行,解決springboot的aop切面不起作用問題(失效的排查)

檢查下springboot的啟動類是否開啟掃描springbootapplicationcomponentscan(basepackages {"com.zhangpu.springboot"})另外springboot默認開啟的enableaspectjautoproxy為true如果不放心可以增加&#xff1a;enableaspectjautoproxy(proxytargetclasstrue)第二種可…

修改readonly屬性的值

一般情況下&#xff0c;readonly屬性的值是無法修改的&#xff0c;但可以通過特殊方式修改。定義一個student的類&#xff0c;其中name屬性為readonly類型的變量 interface JFStudent : NSObjectproperty(nonatomic,copy,readonly) NSString *hisName;property(nonatomic,copy)…

VisualVM:通過SSH監視遠程JVM(是否為JMX)

VisualVM是用于監視JVM&#xff08;5.0&#xff09;的有關內存使用情況&#xff0c;線程&#xff0c;GC&#xff0c;MBeans等的出色工具。讓我們看看如何通過SSH使用它來監視&#xff08;甚至使用JMX對其進行采樣&#xff0c;對帶有JMX的遠程JVM進行監視&#xff09;它。 這篇文…

h5 php js實驗總結,H5學習_番外篇_PHP數據庫操作

1. 文件操作1.1 打開關閉文件fopen()resource fopen ( string filename, string mode [, bool use_include_path [, resource zcontext]] )?fopen()函數將resource綁定到一個流或句柄。綁定之后&#xff0c;腳本就可以通過句柄與此資源交互;例1:以只讀方式打開一個位于本地服務…

ReactNative開發環境

此內容根據徐贏老師的文檔整理后寫處 原版地址&#xff1a;https://tuomaxu.gitbooks.io/reactnative/content/ ReactNative是跨平開發的解決方案&#xff0c;在開發平臺的選擇上&#xff0c;mac平臺和win平臺都可以。 所需要工具如下&#xff1a; 1&#xff0c;Nodejs環境 2&a…

Python自動化開發 - 字符串, 列表, 元組, 字典和和文件操作

一、字符串特性&#xff1a;字符串本身不可修改&#xff0c;除非字符串變量重新賦值。Python3中所有字符串都是Unicode字符串&#xff0c;支持中文。 >>> name "Jonathan" >>> name "Jonathan" "Ni" >>>print(na…

shiro java配置,InI 配置 - 跟我學 Apache Shiro_教程_Java開發社區

INI 配置之前章節我們已經接觸過一些 INI 配置規則了&#xff0c;如果大家使用過如 Spring 之類的 IoC/DI 容器的話&#xff0c;Shiro 提供的 INI 配置也是非常類似的&#xff0c;即可以理解為是一個 IoC/DI 容器&#xff0c;但是區別在于它從一個根對象 securityManager 開始。…

在Spring容器外部連接對象依賴項

有幾種有趣的方法可以設置在Spring容器外部實例化的對象的屬性和依賴關系。 用例首先&#xff0c;為什么我們需要在Spring容器之外進行依賴注入–我知道三個用例&#xff0c;其中我實例化了Spring容器之外的對象并需要注入依賴。 首先考慮使用Spring TaskExecutor執行一系列任…

前端學習路線匯總

https://123.w3cschool.cn/plk2fihttps://www.w3cschool.cn/nodejs/nodejs-global-object.htmlnode.js轉載于:https://www.cnblogs.com/sxz2008/p/7238773.html

MediaInfo源代碼分析 1:整體結構

博客地址&#xff1a;http://blog.csdn.net/leixiaohua1020/article/details/12016231 MediaInfo源代碼分析系列文章列表&#xff1a; MediaInfo源代碼分析 1&#xff1a;整體結構MediaInfo源代碼分析 2&#xff1a;API函數MediaInfo源代碼分析 3&#xff1a;Open()函數MediaI…