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

Java和Rust實(shí)現(xiàn)JSON序列化互轉(zhuǎn)的解決方案詳解

 更新時間:2024年03月12日 08:32:36   作者:螞蟻背大象  
這篇文章主要為大家詳細(xì)介紹了Java和Rust實(shí)現(xiàn)JSON序列化互轉(zhuǎn)的解決方案,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

1.背景

最近在使用Rust實(shí)現(xiàn)Rocketmq的項目 rocketmq-rust,在實(shí)現(xiàn)的過程中就會遇到請求頭以及相關(guān)的數(shù)據(jù)JSON序列化在兩個不同語言中的序列化和反序列的情況。在這種情況下遇到下面的問題:Java中存在繼承,例如

public class Test {

    public static void main(String[] args) {
        Student object = new Student();
        object.setName("mxsm");
        object.setAge("18");
        object.setSchool("杭州電子科技大學(xué)");
        System.out.println(JSON.toJSONString(object));
    }
    
    public static class Person {
        private String name;
        private String age;
		//ignore get set method
    }

    public static class Student extends Person {
        private String school;
		//ignore get set method
    }
}

那么在Java中序列化就會打印成這樣:

{"age":"18","name":"mxsm","school":"杭州電子科技大學(xué)"}

問題就來了。在Rust中沒有這樣的繼承關(guān)系該如何處理這樣的代碼情況。隨著跨語言開發(fā)的流行,將數(shù)據(jù)在不同編程語言之間進(jìn)行序列化和反序列化變得越來越重要。本文將探討如何在Java和Rust之間實(shí)現(xiàn)JSON數(shù)據(jù)的序列化互轉(zhuǎn),并解決在Rust中處理Java繼承序列化的挑戰(zhàn)。

2. Java和Rust之間的JSON序列化互轉(zhuǎn)

Java中有許多庫可以用于JSON序列化,其中最流行的是Jackson和Gson以及Fastjson。我們將以Fastjson為例進(jìn)行介紹(Rocketmq中使用的就是Fastjson進(jìn)行序列)。Rust中使用serde作為例子,在 Rocketmq-rust 項目中JSON序列化使用的是 serde 。

2.1 無繼承的簡單數(shù)據(jù)結(jié)構(gòu)

Java示例代碼:

 public static class Person {
        private String name;
        private String age;
     	private String homeAddress
		//ignore get set method
 }

轉(zhuǎn)換成對應(yīng)的Rust代碼

#[derive(Clone,Debug,Serialize,Deserialize)]
#[serde(rename_all="camelCase")]
pub struct Person{
    name: String,
    age: String,
    home_address: String
}

這里有個需要說明,在Java規(guī)范中字段的命名遵循的是駝峰,而rust使用的snake case,兩者是有區(qū)別的。 這里就需要注意如果是以Java為主的項目那么Rust的序列化和反序列化都應(yīng)該使用駝峰的方式來進(jìn)行。也就是上面代碼的增加的 #[serde(rename_all="camelCase")] 而如果是Rust項目為主,很大可能序列后的JSON字符串使用的就是snake case 那么Java項目就需要進(jìn)行相對應(yīng)的處理。

2.2 Java代碼有繼承的結(jié)構(gòu)

代碼示例:

public static class Person {
        private String name;
        private String age;
		//ignore get set method
    }

    public static class Student extends Person {
        private String school;
		//ignore get set method
    }

在Java代碼中繼承是很常見的一種操作,但是在Rust中struct的繼承并不存在。那么這種情況下應(yīng)該如何解決。

2.2.1 將所有的代碼扁平化

代碼扁平化這個是最簡單的方式。以上面代碼為例。如果扁平化后我們后我們處理后的Rust代碼:

#[derive(Clone,Debug,Serialize,Deserialize)]
#[serde(rename_all="camelCase")]
pub struct Person{
    name: String,
    age: String,
}

#[derive(Clone,Debug,Serialize,Deserialize)]
#[serde(rename_all="camelCase")]
pub struct Person{
    name: String,
    age: String,
    school: String
}

所謂扁平化就是直接將繼承代碼的屬性移到最底層的繼承代碼中。這樣做就是簡單,能夠?qū)崿F(xiàn)和Java相同的序列化的效果。

優(yōu)點(diǎn):

簡單,快速解決問題

缺點(diǎn):

需要實(shí)現(xiàn)的重復(fù)代碼量大

2.2.2 抽象出來trait

將公共的方法操作方法抽象出來trait然后,使用trait繼承的方式來實(shí)現(xiàn)。同樣已上面的代碼為例:

pub trait PersonTrait{
    fn get_name(&self)->String;
    fn get_age(&self)->String;
}

然后所有的struct進(jìn)行實(shí)現(xiàn)。這個優(yōu)缺點(diǎn)也很明顯。

優(yōu)點(diǎn):

  • 簡單,相比第一種方式多了一個抽象trait的步驟,其他的和第一種差不多
  • 可以使用Trait作為方法的參數(shù)或者struct的屬性。提供了類似Java的多態(tài)(這個對于無需要進(jìn)行序列化的比較好)

缺點(diǎn):

需要實(shí)現(xiàn)的重復(fù)代碼量大

2.2.3 使用struct聚合配合serde的扁平化(重點(diǎn))

使用struct聚合配合serde的扁平化來解決Java項目和Rust項目的JSON數(shù)據(jù)的序列化和反序列交互比較優(yōu)的解。通用用上面的代碼為例子。如果使用這種方式來處理,轉(zhuǎn)換成Rust代碼后的代碼:

#[derive(Clone,Debug,Serialize,Deserialize)]
#[serde(rename_all="camelCase")]
pub struct Person{
    name: String,
    age: String,
}

#[derive(Clone,Debug,Serialize,Deserialize)]
#[serde(rename_all="camelCase")]
pub struct Person{
    #[serde(flatten)]  // 這個是扁平化關(guān)鍵
    person: Persion
    school: String
}

同樣定義跟Java相同的代碼,然后通過聚合的方式來模擬Rust中的繼承關(guān)系。 將需要扁平化的代碼進(jìn)行扁平化使用 #[serde(flatten)] 來實(shí)現(xiàn)。

優(yōu)點(diǎn):

  • 能夠和其他語言相同的JSON序列化方式(需要serde的扁平化支持)
  • 整體的序列化相對較靈活

缺點(diǎn):

需要Rust JSON序列化工具的支持。如果工具不支持沒辦法實(shí)現(xiàn)。只能手動序列化

說明:使用struct聚合配合serde的扁平化來解決JSON序列化的方式也是 Rocketmq-rust 項目中的解決方式。因?yàn)閞ocketmq-rust需要支持和Java版本進(jìn)行互通。

3.總結(jié)

對于Java JSON序列化和Rust JSON序列化主要差異由以下兩種原因引起:

  • 屬性的命名規(guī)范,Java使用的是駝峰 而Rust使用的是snake case。這就導(dǎo)致在序列化的情況下兩者之間的序列化會存在屬性的命名差異。
  • Java有繼承關(guān)系,繼承的最底層的類進(jìn)行序列化會將父類的屬性進(jìn)行扁平化序列化。而Rust中不存在所以導(dǎo)致Rust中的序列化的差異性,為了解決這種差異性就有了上面的三種方式。

就單純解決JSON序列化使用 使用struct聚合配合serde的扁平化 是一種比較憂的解決方式。但是不是唯一的方式。

到此這篇關(guān)于Java和Rust實(shí)現(xiàn)JSON序列化互轉(zhuǎn)的解決方案詳解的文章就介紹到這了,更多相關(guān)Java Rust實(shí)現(xiàn)JSON序列化互轉(zhuǎn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springboot執(zhí)行延時任務(wù)之DelayQueue的使用詳解

    springboot執(zhí)行延時任務(wù)之DelayQueue的使用詳解

    DelayQueue是一個無界阻塞隊列,只有在延遲期滿時,才能從中提取元素。這篇文章主要介紹了springboot執(zhí)行延時任務(wù)-DelayQueue的使用,需要的朋友可以參考下
    2019-12-12
  • 基于Java開發(fā)一個Markdown到Word文檔轉(zhuǎn)換工具

    基于Java開發(fā)一個Markdown到Word文檔轉(zhuǎn)換工具

    本文介紹了一個用Java開發(fā)的Markdown到Word文檔轉(zhuǎn)換工具,該工具通過MarkdownToWordConverter類實(shí)現(xiàn),利用flexmark庫將Markdown內(nèi)容轉(zhuǎn)換為HTML,借助jsoup庫規(guī)范化HTML,再通過docx4j庫將處理后的HTML導(dǎo)入并保存為Word文檔,需要的朋友可以參考下
    2025-07-07
  • Java中BigDecimal與0比較的一個坑實(shí)戰(zhàn)記錄

    Java中BigDecimal與0比較的一個坑實(shí)戰(zhàn)記錄

    BigDecimal屬于大數(shù)據(jù),精度極高,不屬于基本數(shù)據(jù)類型,屬于java對象,下面這篇文章主要給大家介紹了關(guān)于Java中BigDecimal與0比較的一個坑的相關(guān)資料,需要的朋友可以參考下
    2022-12-12
  • Spring?Security配置多個數(shù)據(jù)源并添加登錄驗(yàn)證碼的實(shí)例代碼

    Spring?Security配置多個數(shù)據(jù)源并添加登錄驗(yàn)證碼的實(shí)例代碼

    這篇文章主要介紹了Spring?Security配置多個數(shù)據(jù)源并添加登錄驗(yàn)證碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • Java 的可變參數(shù)方法詳述

    Java 的可變參數(shù)方法詳述

    這篇文章主要介紹了Java 的可變參數(shù)方法,可變參數(shù)只能作為函數(shù)的最后一個參數(shù),在其前面可以有也可以沒有任何其他參數(shù),由于可變參數(shù)必須是最后一個參數(shù),所以一個函數(shù)最多只能有一個可變參數(shù),下面我們一起進(jìn)入文章了解更多關(guān)于可變參數(shù)的內(nèi)容吧
    2022-02-02
  • Java實(shí)現(xiàn)整合文件上傳到FastDFS的方法詳細(xì)

    Java實(shí)現(xiàn)整合文件上傳到FastDFS的方法詳細(xì)

    FastDFS是一個開源的輕量級分布式文件系統(tǒng),對文件進(jìn)行管理,功能包括:文件存儲、文件同步、文件上傳、文件下載等,解決了大容量存儲和負(fù)載均衡的問題。本文將提供Java將文件上傳至FastDFS的示例代碼,需要的參考一下
    2022-02-02
  • 關(guān)于Spring中@Lazy注解的使用

    關(guān)于Spring中@Lazy注解的使用

    這篇文章主要介紹了關(guān)于Spring中@Lazy注解的使用,@Lazy注解用于標(biāo)識bean是否需要延遲加載,沒加注解之前主要容器啟動就會實(shí)例化bean,本文提供了部分實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2023-08-08
  • 關(guān)于ZooKeeper的會話機(jī)制Session解讀

    關(guān)于ZooKeeper的會話機(jī)制Session解讀

    這篇文章主要介紹了關(guān)于ZooKeeper的會話機(jī)制Session解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • SpringBoot+URule實(shí)現(xiàn)可視化規(guī)則引擎的方法示例

    SpringBoot+URule實(shí)現(xiàn)可視化規(guī)則引擎的方法示例

    規(guī)則引擎其實(shí)是一種組件,它可以嵌入到程序當(dāng)中,將程序復(fù)雜的判斷規(guī)則從業(yè)務(wù)代碼中剝離出來,使得程序只需要關(guān)心自己的業(yè)務(wù),而不需要去進(jìn)行復(fù)雜的邏輯判斷,本文給大家介紹了SpringBoot+URule實(shí)現(xiàn)可視化規(guī)則引擎的方法示例,需要的朋友可以參考下
    2024-12-12
  • Springboot項目的搭建教程(分離出common父依賴)

    Springboot項目的搭建教程(分離出common父依賴)

    這篇文章主要介紹了Springboot項目的搭建教程(分離出common父依賴),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01

最新評論

金秀| 乌鲁木齐县| 闽清县| 安新县| 双桥区| 中山市| 都江堰市| 奎屯市| 石台县| 天门市| 呼和浩特市| 慈利县| 交口县| 东兰县| 荥经县| 高碑店市| 华安县| 池州市| 利川市| 怀柔区| 海兴县| 陕西省| 泰来县| 潮州市| 临汾市| 砀山县| 潮州市| 深水埗区| 玛曲县| 额尔古纳市| 平和县| 新野县| 万荣县| 盈江县| 旺苍县| 渝中区| 白城市| 营口市| 建始县| 靖边县| 青河县|