欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

1.背景

最近在使用Rust實(shí)現(xiàn)Rocketmq的項(xiàng)目 rocketmq-rust,在實(shí)現(xiàn)的過(guò)程中就會(huì)遇到請(qǐng)求頭以及相關(guān)的數(shù)據(jù)JSON序列化在兩個(gè)不同語(yǔ)言中的序列化和反序列的情況。在這種情況下遇到下面的問(wèn)題: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中序列化就會(huì)打印成這樣:

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

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

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

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

2.1 無(wú)繼承的簡(jiǎn)單數(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)換成對(duì)應(yīng)的Rust代碼

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

這里有個(gè)需要說(shuō)明,在Java規(guī)范中字段的命名遵循的是駝峰,而rust使用的snake case,兩者是有區(qū)別的。 這里就需要注意如果是以Java為主的項(xiàng)目那么Rust的序列化和反序列化都應(yīng)該使用駝峰的方式來(lái)進(jìn)行。也就是上面代碼的增加的 #[serde(rename_all="camelCase")] 而如果是Rust項(xiàng)目為主,很大可能序列后的JSON字符串使用的就是snake case 那么Java項(xiàng)目就需要進(jìn)行相對(duì)應(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代碼中繼承是很常見(jiàn)的一種操作,但是在Rust中struct的繼承并不存在。那么這種情況下應(yīng)該如何解決。

2.2.1 將所有的代碼扁平化

代碼扁平化這個(gè)是最簡(jiǎ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{
    name: String,
    age: String,
    school: String
}

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

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

簡(jiǎn)單,快速解決問(wèn)題

缺點(diǎn):

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

2.2.2 抽象出來(lái)trait

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

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

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

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

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

缺點(diǎn):

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

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

使用struct聚合配合serde的扁平化來(lái)解決Java項(xiàng)目和Rust項(xiàng)目的JSON數(shù)據(jù)的序列化和反序列交互比較優(yōu)的解。通用用上面的代碼為例子。如果使用這種方式來(lái)處理,轉(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)]  // 這個(gè)是扁平化關(guān)鍵
    person: Persion
    school: String
}

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

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

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

缺點(diǎn):

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

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

3.總結(jié)

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

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

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

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

相關(guān)文章

  • 詳解Java中的reactive stream協(xié)議

    詳解Java中的reactive stream協(xié)議

    Stream大家應(yīng)該都很熟悉了,java8中為所有的集合類(lèi)都引入了Stream的概念。優(yōu)雅的鏈?zhǔn)讲僮鳎魇教幚磉壿?,相信用過(guò)的人都會(huì)愛(ài)不釋手。本文將詳細(xì)介紹Java中的reactive stream協(xié)議。
    2021-06-06
  • Spring的Ioc模擬實(shí)現(xiàn)詳細(xì)介紹

    Spring的Ioc模擬實(shí)現(xiàn)詳細(xì)介紹

    這篇文章主要介紹了Spring的Ioc模擬實(shí)現(xiàn)詳細(xì)介紹,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • java web如何解決瞬間高并發(fā)

    java web如何解決瞬間高并發(fā)

    這篇文章主要為大家詳細(xì)介紹了java web解決瞬間高并發(fā)的策略,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • Tomcat安裝配置及Eclipse配置詳解

    Tomcat安裝配置及Eclipse配置詳解

    給大家介紹一下Tomcat安裝配置及Eclipse配置的全部圖文過(guò)程,如果你對(duì)這個(gè)還有不明白,一起跟著小編學(xué)習(xí)下。
    2017-11-11
  • Java算法之?dāng)?shù)組冒泡排序代碼實(shí)例講解

    Java算法之?dāng)?shù)組冒泡排序代碼實(shí)例講解

    這篇文章主要介紹了Java算法之?dāng)?shù)組冒泡排序代碼實(shí)例講解,文中用代碼舉例講解的很清晰,有感興趣的同學(xué)可以研究下
    2021-03-03
  • Mybatis或Mybatis-Plus框架的xml文件中特殊符號(hào)的使用詳解

    Mybatis或Mybatis-Plus框架的xml文件中特殊符號(hào)的使用詳解

    這篇文章主要介紹了Mybatis或Mybatis-Plus框架的xml文件中特殊符號(hào)的使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • SSM框架+Plupload實(shí)現(xiàn)分塊上傳大文件示例

    SSM框架+Plupload實(shí)現(xiàn)分塊上傳大文件示例

    這篇文章主要介紹了SSM框架+Plupload實(shí)現(xiàn)分塊上傳示例(Spring+SpringMVC+MyBatis+Plupload),將用戶(hù)選中的文件(可多個(gè))分隔成一個(gè)個(gè)小塊,依次向服務(wù)器上傳,有興趣的可以了解一下。
    2017-03-03
  • Java?電話(huà)號(hào)碼的組合示例詳解

    Java?電話(huà)號(hào)碼的組合示例詳解

    這篇文章主要介紹了Java?電話(huà)號(hào)碼的組合,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • Maven指定JDK版本的實(shí)現(xiàn)

    Maven指定JDK版本的實(shí)現(xiàn)

    本文主要介紹了Maven指定JDK版本的實(shí)現(xiàn),主要有兩種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-09-09
  • Java的MoreSuppliers工具類(lèi)方法解析

    Java的MoreSuppliers工具類(lèi)方法解析

    這篇文章主要介紹了Java的MoreSuppliers工具類(lèi)方法解析,MoreSuppliers類(lèi)是一個(gè)Java工具類(lèi),它提供了一些增強(qiáng)的Supplier函數(shù),使得Supplier執(zhí)行的結(jié)果可以被緩存,真正的調(diào)用只執(zhí)行一次,需要的朋友可以參考下
    2024-01-01

最新評(píng)論