最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

ProtoStuff不支持BigDecimal序列化及反序列化詳解

 更新時間:2022年08月20日 09:33:44   作者:一灰灰  
這篇文章主要為大家介紹了ProtoStuff不支持BigDecimal序列化/反序列化,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

引言

平時使用ProtoStuff作為序列化工具,對于一些POJO對象序列化,但是在實際使用中,發(fā)現(xiàn)針對BigDecimal對象進行序列化時卻出現(xiàn)了問題

  • 不管什么數(shù),生成的byte數(shù)組都一樣
  • 無法正確反序列化

下面記錄一下這個問題

1. 場景復(fù)現(xiàn)

我們使用的protostuff依賴如下

 <dependency>
    <groupId>com.dyuproject.protostuff</groupId>
    <artifactId>protostuff-core</artifactId>
    <version>1.1.3</version>
</dependency>
<dependency>
    <groupId>com.dyuproject.protostuff</groupId>
    <artifactId>protostuff-runtime</artifactId>
    <version>1.1.3</version>
</dependency>

寫一個簡單測試demo,如下

public static byte[] serialize(Object obj) {
    Schema schema = RuntimeSchema.getSchema(obj.getClass());
    LinkedBuffer buffer = LinkedBuffer.allocate(1048576);
    byte[] protoStuff;
    try {
        protoStuff = ProtostuffIOUtil.toByteArray(obj, schema, buffer);
    } catch (Exception var8) {
        throw new RuntimeException("Failed to serializer");
    } finally {
        buffer.clear();
    }
    return protoStuff;
}
public static <T> T deserialize(byte[] paramArrayOfByte, Class<T> targetClass) {
    if (paramArrayOfByte != null && paramArrayOfByte.length != 0) {
        Schema<T> schema = RuntimeSchema.getSchema(targetClass);
        T instance = schema.newMessage();
        ProtostuffIOUtil.mergeFrom(paramArrayOfByte, instance, schema);
        return instance;
    } else {
        throw new RuntimeException("Failed to deserialize");
    }
}
@Test
public void testSer() {
    byte[] ans = serialize(new BigDecimal(20));
    byte[] ans2 = serialize(new BigDecimal(120));
    System.out.println(new String(ans));
    System.out.println(new String(ans2));
    BigDecimal res = deserialize(ans, BigDecimal.class);
    System.out.println(res);
}

執(zhí)行如下

2. 疑似原因與兼容方法

并沒有找到具體的原因,在github上有一個issure: github.com/protostuff/…,其中回復(fù)為

Protostuff works on user-defined types (pojos), not on built-in jdk types.

上面的說法是ProtoStuff更多的是用于簡單對象的序列化,而不是基礎(chǔ)的jdk類型,因此推薦的是序列一個成員變量為BigDecimal的對象

接下來我們試一下,定義一個簡單的對象,成員為BigDecimal的場景

@Data
public static class InnerDecimal {
    private BigDecimal decimal;
    public InnerDecimal() {
    }
    public InnerDecimal(BigDecimal decimal) {
        this.decimal = decimal;
    }
}
@Test
public void testSer() {
    byte[] ans = serialize(new InnerDecimal(new BigDecimal(20.123)));
    byte[] ans2 = serialize(new InnerDecimal(new BigDecimal(120.1970824)));
    System.out.println(new String(ans));
    System.out.println(new String(ans2));
    InnerDecimal res = deserialize(ans, InnerDecimal.class);
    System.out.println(res);
}

測試輸出如下

上面雖然可以正常工作,但與我們希望的差別有點大,序列化一個BigDecimal,還需要定義一個POJO包裝他,有點麻煩;

于是一個猥瑣的方法就是在序列化和反序列化的時候,針對BigDeimal進行特殊處理

public static byte[] serialize(Object obj) {
    if (obj instanceof BigDecimal) {
        obj = ((BigDecimal) obj).toPlainString();
    }
    Schema schema = RuntimeSchema.getSchema(obj.getClass());
    LinkedBuffer buffer = LinkedBuffer.allocate(1048576);
    byte[] protoStuff;
    try {
        protoStuff = ProtostuffIOUtil.toByteArray(obj, schema, buffer);
    } catch (Exception var8) {
        throw new RuntimeException("Failed to serializer");
    } finally {
        buffer.clear();
    }
    return protoStuff;
}
public static <T> T deserialize(byte[] paramArrayOfByte, Class<T> targetClass) {
    if (paramArrayOfByte != null && paramArrayOfByte.length != 0) {
        Schema schema;
        if (targetClass.isAssignableFrom(BigDecimal.class)) {
            schema = RuntimeSchema.getSchema(String.class);
            Object instance = schema.newMessage();
            ProtostuffIOUtil.mergeFrom(paramArrayOfByte, instance, schema);
            return (T) new BigDecimal((String) instance);
        } else {
            schema = RuntimeSchema.getSchema(targetClass);
            Object instance = schema.newMessage();
            ProtostuffIOUtil.mergeFrom(paramArrayOfByte, instance, schema);
            return (T) instance;
        }
    } else {
        throw new RuntimeException("Failed to deserialize");
    }
}

再次測試,正常執(zhí)行

以上就是ProtoStuff不支持BigDecimal序列化及反序列化詳解的詳細(xì)內(nèi)容,更多關(guān)于ProtoStuff不支持BigDecimal的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • MyBatis通過JDBC數(shù)據(jù)驅(qū)動生成的執(zhí)行語句問題

    MyBatis通過JDBC數(shù)據(jù)驅(qū)動生成的執(zhí)行語句問題

    這篇文章主要介紹了MyBatis通過JDBC數(shù)據(jù)驅(qū)動生成的執(zhí)行語句問題的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-08-08
  • Java中基于DeferredResult的異步服務(wù)詳解

    Java中基于DeferredResult的異步服務(wù)詳解

    這篇文章主要介紹了Java中基于DeferredResult的異步服務(wù)詳解,DeferredResult字面意思是"延遲結(jié)果",它允許Spring MVC收到請求后,立即釋放(歸還)容器線程,以便容器可以接收更多的外部請求,提升吞吐量,需要的朋友可以參考下
    2023-12-12
  • 深入了解java中的string對象

    深入了解java中的string對象

    這篇文章主要介紹了java中的string對象,String對象是Java中使用最頻繁的對象之一,所以Java開發(fā)者們也在不斷地對String對象的實現(xiàn)進行優(yōu)化,以便提升String對象的性能。對此感興趣的朋友跟隨小編一起看看吧
    2019-11-11
  • 解析Java的InputStream類并借助其讀取ppt文件

    解析Java的InputStream類并借助其讀取ppt文件

    這篇文章主要介紹了Java的InputStream類并借助其讀取ppt文件,講到了InputStream類中一些常用的方法的問題,需要的朋友可以參考下
    2015-11-11
  • 解決FileWriter 寫入文本不換行的問題

    解決FileWriter 寫入文本不換行的問題

    這篇文章主要介紹了解決FileWriter 寫入文本不換行的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 一文講通Java為什么不支持多繼承原理

    一文講通Java為什么不支持多繼承原理

    這篇文章主要為大家介紹了java為什么不支持多繼承原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • java獲取json中的全部鍵值對實例

    java獲取json中的全部鍵值對實例

    下面小編就為大家分享一篇java獲取json中的全部鍵值對實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03
  • Java?file類中renameTo方法操作實例

    Java?file類中renameTo方法操作實例

    renameTo()方法是File類的一部分,renameTo()函數(shù)用于將文件的抽象路徑名重命名為給定的路徑名??,下面這篇文章主要給大家介紹了關(guān)于Java?file類中renameTo方法操作的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • Java實現(xiàn)斷點下載功能的示例代碼

    Java實現(xiàn)斷點下載功能的示例代碼

    當(dāng)下載一個很大的文件時,如果下載到一半暫停,如果繼續(xù)下載呢?斷點下載就是解決這個問題的。本文將用Java語言實現(xiàn)斷點下載,需要的可以參考一下
    2022-05-05
  • Java中Map和Set練習(xí)項目實例代碼

    Java中Map和Set練習(xí)項目實例代碼

    這篇文章主要給大家介紹了關(guān)于Java中Map和Set練習(xí)項目的相關(guān)資料,首先介紹了如何使用map來統(tǒng)計字符串?dāng)?shù)組中每個字符串的出現(xiàn)次數(shù),然后討論了如何使用set來找出只出現(xiàn)一次的數(shù)字,最后提出了一個解決壞鍵盤打字問題的思路,需要的朋友可以參考下
    2024-11-11

最新評論

鄂州市| 合江县| 浏阳市| 鲜城| 兴义市| 阿克陶县| 潮安县| 瓮安县| 体育| 锡林郭勒盟| 旬阳县| 汪清县| 德清县| 四平市| 赤城县| 遵化市| 酉阳| 蒲江县| 德江县| 防城港市| 阳春市| 鸡西市| 建湖县| 哈巴河县| 陕西省| 神农架林区| 监利县| 乾安县| 墨脱县| 清丰县| 大城县| 盐亭县| 宣城市| 兴义市| 日喀则市| 庆元县| 镇江市| 锦屏县| 辽宁省| 沙田区| 饶河县|