国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

DevOps系列文章 之 SnakeYAML解析與序列化YAML

這篇具有很好參考價(jià)值的文章主要介紹了DevOps系列文章 之 SnakeYAML解析與序列化YAML。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

1、簡(jiǎn)述

如何使用SnakeYAML庫(kù)將
YAML文檔轉(zhuǎn)換為Java對(duì)象,以及JAVA對(duì)象如何序列化為YAML文檔。

在DevOps平臺(tái)系統(tǒng)中是基礎(chǔ)的能力支持,不管是spring boot 的配置還是K8S 資源清單yaml

2、項(xiàng)目設(shè)置

要在項(xiàng)目中使用SnakeYAML,需要添加Maven依賴項(xiàng)(可在此處找到最新版本)

<dependency>
    <groupId>org.yaml</groupId>
    <artifactId>snakeyaml</artifactId>
    <version>1.25</version>
</dependency>

3、入口點(diǎn)

YAML類是API的入口點(diǎn):

Yaml yaml = new Yaml()

由于實(shí)現(xiàn)不是線程安全的,因此不同的線程必須具有自己的Yaml實(shí)例。

4、加載YAML文檔

SnakeYAML支持從StringInputStream加載文檔,我們從定義一個(gè)簡(jiǎn)單的YAML文檔開(kāi)始,然后將文件命名為customer.yaml

基本用法

現(xiàn)在,我們將使用Yaml類來(lái)解析上述YAML文檔:

public class YamlTest {
    public static void main(String[] args) {
        Yaml yaml = new Yaml();
        InputStream inputStream = YamlTest.class
                .getClassLoader()
                .getResourceAsStream("customer.yaml");
        Map<String, Object> obj = yaml.load(inputStream);
        System.out.println(obj);

    }
}

上面的代碼生成以下輸出:?

DevOps系列文章 之 SnakeYAML解析與序列化YAML,java,kubernetes

?

默認(rèn)情況下,load()方法返回一個(gè)Map對(duì)象。查詢Map對(duì)象時(shí),我們需要事先知道屬性鍵的名稱,否則容易出錯(cuò)。更好的辦法是自定義類型。

自定義類型解析

SnakeYAML提供了一種將文檔解析為自定義類型的方法

讓我們定義一個(gè)Customer類,然后嘗試再次加載該文檔:

package com.devops.autocicdstore.yaml;

/**
 * @Author 虎哥
 * @Description //TODO
 * |要帶著問(wèn)題去學(xué)習(xí),多猜想多驗(yàn)證|
 **/

public class Customer {

    private String firstName;
    private String lastName;
    private int age;

    // getters and setters

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Customer{" +
                "firstName='" + firstName + '\'' +
                ", lastName='" + lastName + '\'' +
                ", age=" + age +
                '}';
    }
}

現(xiàn)在我么來(lái)加載:?

        Yaml yaml = new Yaml(new Constructor(Customer.class));
        InputStream inputStream = YamlTest.class
                .getClassLoader()
                .getResourceAsStream("customer.yaml");
        Customer customer = yaml.load(inputStream);
        System.out.println(customer);

隱式類型

如果沒(méi)有為給定屬性定義類型,則庫(kù)會(huì)自動(dòng)將值轉(zhuǎn)換為隱式type。

例如:

1.0 -> Float
42 -> Integer
2009-03-30 -> Date

讓我們使用一個(gè)TestCase來(lái)測(cè)試這種隱式類型轉(zhuǎn)換:

@org.junit.Test
    public void whenLoadYAML_thenLoadCorrectImplicitTypes() {
        Yaml yaml = new Yaml();
        Map<Object, Object> document = yaml.load("3.0: 2018-07-22");
        System.out.println(document);
        assertNotNull(document);
        assertEquals(1, document.size());
        assertTrue(document.containsKey(3.0d));
    }

嵌套對(duì)象

SnakeYAML?支持嵌套的復(fù)雜類型。

讓我們向“?customer.yaml”添加“?聯(lián)系方式”??和“?地址”?詳細(xì)信息,并將新文件另存為customer_with_contact_details_and_address.yaml.

現(xiàn)在,我們將分析新的YAML文檔

firstName: "John"
lastName: "Doe"
age: 31
contactDetails:
   - type: "mobile"
     number: 123456789
   - type: "landline"
     number: 456786868
homeAddress:
   line: "Xyz, DEF Street"
   city: "City Y"
   state: "State Y"
   zip: 345657

我們來(lái)更新java類:

package com.devops.autocicdstore.yaml;

import java.util.List;

/**
 * @Author 虎哥
 * @Description //TODO
 * |要帶著問(wèn)題去學(xué)習(xí),多猜想多驗(yàn)證|
 **/

public class Customer {

    private String firstName;
    private String lastName;
    private int age;
    private List<Contact> contactDetails;
    private Address homeAddress;

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public List<Contact> getContactDetails() {
        return contactDetails;
    }

    public void setContactDetails(List<Contact> contactDetails) {
        this.contactDetails = contactDetails;
    }

    public Address getHomeAddress() {
        return homeAddress;
    }

    public void setHomeAddress(Address homeAddress) {
        this.homeAddress = homeAddress;
    }

    @Override
    public String toString() {
        return "Customer{" +
                "firstName='" + firstName + '\'' +
                ", lastName='" + lastName + '\'' +
                ", age=" + age +
                ", contactDetails=" + contactDetails +
                ", homeAddress=" + homeAddress +
                '}';
    }
}

package com.devops.autocicdstore.yaml;

/**
 * @Author 虎哥
 * @Description //TODO
 * |要帶著問(wèn)題去學(xué)習(xí),多猜想多驗(yàn)證|
 **/
public class Address {
    private String line;
    private String city;
    private String state;
    private Integer zip;

    public String getLine() {
        return line;
    }

    public void setLine(String line) {
        this.line = line;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

    public Integer getZip() {
        return zip;
    }

    public void setZip(Integer zip) {
        this.zip = zip;
    }

    @Override
    public String toString() {
        return "Address{" +
                "line='" + line + '\'' +
                ", city='" + city + '\'' +
                ", state='" + state + '\'' +
                ", zip=" + zip +
                '}';
    }
}

package com.devops.autocicdstore.yaml;

/**
 * @Author 虎哥
 * @Description //TODO
 * |要帶著問(wèn)題去學(xué)習(xí),多猜想多驗(yàn)證|
 **/
public class Contact {
    private String type;
    private int number;

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    @Override
    public String toString() {
        return "Contact{" +
                "type='" + type + '\'' +
                ", number=" + number +
                '}';
    }
}

現(xiàn)在,我們來(lái)測(cè)試下Yamlload()

@Test
    public void
    whenLoadYAMLDocumentWithTopLevelClass_thenLoadCorrectJavaObjectWithNestedObjects() {

        Yaml yaml = new Yaml(new Constructor(Customer.class));
        InputStream inputStream = this.getClass()
                .getClassLoader()
                .getResourceAsStream("customer_with_contact_details_and_address.yaml");
        Customer customer = yaml.load(inputStream);
        System.out.println(customer);
        assertNotNull(customer);
        assertEquals("John", customer.getFirstName());
        assertEquals("Doe", customer.getLastName());
        assertEquals(31, customer.getAge());
        assertNotNull(customer.getContactDetails());
        assertEquals(2, customer.getContactDetails().size());

        assertEquals("mobile", customer.getContactDetails()
                .get(0)
                .getType());
        assertEquals(123456789, customer.getContactDetails()
                .get(0)
                .getNumber());
        assertEquals("landline", customer.getContactDetails()
                .get(1)
                .getType());
        assertEquals(456786868, customer.getContactDetails()
                .get(1)
                .getNumber());
        assertNotNull(customer.getHomeAddress());
        assertEquals("Xyz, DEF Street", customer.getHomeAddress()
                .getLine());
    }

DevOps系列文章 之 SnakeYAML解析與序列化YAML,java,kubernetes

?

類型安全的集合

當(dāng)給定Java類的一個(gè)或多個(gè)屬性是泛型集合類時(shí),需要通過(guò)TypeDescription來(lái)指定泛型類型,以便可以正確解析。

讓我們假設(shè)?一個(gè)Customer擁有多個(gè)Contact

firstName: "John"
lastName: "Doe"
age: 31
contactDetails:
   - { type: "mobile", number: 123456789}
   - { type: "landline", number: 123456789}

為了能正確解析,我們可以在頂級(jí)類上為給定屬性指定TypeDescription?

@Test
    public void test1(){
        Constructor constructor = new Constructor(Customer.class);
        TypeDescription customTypeDescription = new TypeDescription(Customer.class);
        customTypeDescription.addPropertyParameters("contactDetails", Contact.class);
        constructor.addTypeDescription(customTypeDescription);
        Yaml yaml = new Yaml(new Constructor(Customer.class));
        InputStream inputStream = this.getClass()
                .getClassLoader()
                .getResourceAsStream("customer_with_contact_details_and_address.yaml");
        Customer customer = yaml.load(inputStream);
        System.out.println(customer);
    }

DevOps系列文章 之 SnakeYAML解析與序列化YAML,java,kubernetes?

?

載入多個(gè)文件

在某些情況下,單個(gè)文件中可能有多個(gè)YAML文檔,而我們想解析所有文檔。所述YAML類提供了一個(gè)LOADALL()方法來(lái)完成這種類型的解析。

假設(shè)下面的內(nèi)容在一個(gè)文件中:

---
firstName: "John"
lastName: "Doe"
age: 20
---
firstName: "Jack"
lastName: "Jones"
age: 25

我們可以使用loadAll()方法解析以上內(nèi)容,如以下代碼示例所示:


    @Test
    public void whenLoadMultipleYAMLDocuments_thenLoadCorrectJavaObjects() {
        Yaml yaml = new Yaml(new Constructor(Customer.class));
        InputStream inputStream = this.getClass()
                .getClassLoader()
                .getResourceAsStream("customers.yaml");

        int count = 0;
        for (Object object : yaml.loadAll(inputStream)) {
            count++;
            assertTrue(object instanceof Customer);
            System.out.println(object);
        }
        assertEquals(2,count);
    }

DevOps系列文章 之 SnakeYAML解析與序列化YAML,java,kubernetes

5、生成YAML文件

SnakeYAML?支持 將java對(duì)象序列化為yml。

基本用法

我們將從一個(gè)將Map <String,Object>的實(shí)例轉(zhuǎn)儲(chǔ)到Y(jié)AML文檔(String)的簡(jiǎn)單示例開(kāi)始:

@Test
    public void whenDumpMap_thenGenerateCorrectYAML() {
        Map<String, Object> data = new LinkedHashMap<String, Object>();
        data.put("name", "Silenthand Olleander");
        data.put("race", "Human");
        data.put("traits", new String[] { "ONE_HAND", "ONE_EYE" });
        Yaml yaml = new Yaml();
        StringWriter writer = new StringWriter();
        yaml.dump(data, writer);
        String expectedYaml = "name: Silenthand Olleander\nrace: Human\ntraits: [ONE_HAND, ONE_EYE]\n";
        System.out.println(writer);
        assertEquals(expectedYaml, writer.toString());
    }

上面的代碼產(chǎn)生以下輸出(請(qǐng)注意,使用LinkedHashMap的實(shí)例將保留輸出數(shù)據(jù)的順序):

DevOps系列文章 之 SnakeYAML解析與序列化YAML,java,kubernetes

自定義Java對(duì)象

我們還可以選擇將自定義Java類型轉(zhuǎn)儲(chǔ)到輸出流中

 @Test
    public void whenDumpACustomType_thenGenerateCorrectYAML() {
        Customer customer = new Customer();
        customer.setAge(45);
        customer.setFirstName("Greg");
        customer.setLastName("McDowell");
        Yaml yaml = new Yaml();
        StringWriter writer = new StringWriter();
        yaml.dump(customer, writer);
        String expectedYaml = "!!com.devops.autocicdstore.yaml.Customer {age: 45, contactDetails: null, firstName: Greg,\n  homeAddress: null, lastName: McDowell}\n";
        System.out.println(writer);
        assertEquals(expectedYaml, writer.toString());
    }

?DevOps系列文章 之 SnakeYAML解析與序列化YAML,java,kubernetes?

?

生成內(nèi)容會(huì)包含!!com.devops.autocicdstore.yaml.Customer,為了避免在輸出文件中使用標(biāo)簽名,我們可以使用庫(kù)提供的??dumpAs()方法。

因此,在上面的代碼中,我們可以進(jìn)行以下調(diào)整以刪除標(biāo)記:

yaml.dumpAs(customer, Tag.MAP, null);
String ccustomerStr = yaml.dumpAs(customer, Tag.MAP, null);
System.out.println(ccustomerStr);

DevOps系列文章 之 SnakeYAML解析與序列化YAML,java,kubernetes?

?

?本文說(shuō)明了SnakeYAML庫(kù)解析和序列化YAML文檔。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-536040.html

到了這里,關(guān)于DevOps系列文章 之 SnakeYAML解析與序列化YAML的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【優(yōu)化技術(shù)專題】「性能優(yōu)化系列」針對(duì)Java對(duì)象壓縮及序列化技術(shù)的探索之路

    【優(yōu)化技術(shù)專題】「性能優(yōu)化系列」針對(duì)Java對(duì)象壓縮及序列化技術(shù)的探索之路

    序列化和反序列化 序列化就是指把對(duì)象轉(zhuǎn)換為字節(jié)碼; 對(duì)象傳遞和保存時(shí),保證對(duì)象的完整性和可傳遞性。把對(duì)象轉(zhuǎn)換為有字節(jié)碼,以便在網(wǎng)絡(luò)上傳輸或保存在本地文件中; 反序列化就是指把字節(jié)碼恢復(fù)為對(duì)象; 根據(jù)字節(jié)流中保存的對(duì)象狀態(tài)及描述信息,通過(guò)反序列化重建

    2024年01月22日
    瀏覽(25)
  • 【序列化與反序列化】關(guān)于序列化與反序列化MessagePack的實(shí)踐

    【序列化與反序列化】關(guān)于序列化與反序列化MessagePack的實(shí)踐

    在進(jìn)行序列化操作之前,我們還對(duì)系統(tǒng)進(jìn)行壓測(cè),通過(guò) jvisualvm 分析cpu,線程,垃圾回收情況等;運(yùn)用火焰圖 async-profiler 分析系統(tǒng)性能,找出程序中占用CPU資源時(shí)間最長(zhǎng)的代碼塊。 代碼放置GitHub:https://github.com/nateshao/leetcode/tree/main/source-code/src/main/java/com/nateshao/source/code/ser

    2024年02月11日
    瀏覽(28)
  • 【網(wǎng)絡(luò)】序列化反序列化

    【網(wǎng)絡(luò)】序列化反序列化

    在前文《網(wǎng)絡(luò)編程套接字》中,我們實(shí)現(xiàn)了服務(wù)器與客戶端之間的字符串通信,這是非常簡(jiǎn)單的通信,在實(shí)際使用的過(guò)程中,網(wǎng)絡(luò)需要傳輸?shù)牟粌H僅是字符串,更多的是結(jié)構(gòu)化的數(shù)據(jù)(類似于 class , struct 類似的數(shù)據(jù))。 那么我們應(yīng)該怎么發(fā)送這些結(jié)構(gòu)化的數(shù)據(jù)呢? 如果我們

    2024年02月05日
    瀏覽(29)
  • 序列化,反序列化之實(shí)例

    序列化,反序列化之實(shí)例

    介紹文章 __construct() 當(dāng)一個(gè)對(duì)象創(chuàng)建時(shí)自動(dòng)調(diào)用 __destruct() 當(dāng)對(duì)象被銷(xiāo)毀時(shí)自動(dòng)調(diào)用 (php絕大多數(shù)情況下會(huì)自動(dòng)調(diào)用銷(xiāo)毀對(duì)象) __sleep() 使**用serialize()函數(shù)時(shí)觸發(fā) __wakeup 使用unserialse()**函數(shù)時(shí)會(huì)自動(dòng)調(diào)用 __toString 當(dāng)一個(gè)對(duì)象被當(dāng)作一個(gè)字符串被調(diào)用 __call() 在對(duì)象上下文中調(diào)用不

    2024年02月14日
    瀏覽(28)
  • 協(xié)議,序列化,反序列化,Json

    協(xié)議,序列化,反序列化,Json

    協(xié)議究竟是什么呢?首先得知道主機(jī)之間的網(wǎng)絡(luò)通信交互的是什么數(shù)據(jù),像平時(shí)使用聊天APP聊天可以清楚,用戶看到的不僅僅是聊天的文字,還能夠看到用戶的頭像昵稱等其他屬性。也就可以證明網(wǎng)絡(luò)通信不僅僅是交互字符串那么簡(jiǎn)單。事實(shí)上網(wǎng)絡(luò)通信還可能會(huì)通過(guò)一個(gè)結(jié)構(gòu)

    2024年02月13日
    瀏覽(25)
  • 【網(wǎng)絡(luò)】協(xié)議定制+序列化/反序列化

    【網(wǎng)絡(luò)】協(xié)議定制+序列化/反序列化

    如果光看定義很難理解序列化的意義,那么我們可以從另一個(gè)角度來(lái)推導(dǎo)出什么是序列化, 那么究竟序列化的目的是什么? 其實(shí)序列化最終的目的是為了對(duì)象可以 跨平臺(tái)存儲(chǔ),和進(jìn)行網(wǎng)絡(luò)傳輸 。而我們進(jìn)行跨平臺(tái)存儲(chǔ)和網(wǎng)絡(luò)傳輸?shù)姆绞骄褪荌O,而我們的IO支持的數(shù)據(jù)格式就是

    2024年02月08日
    瀏覽(21)
  • Qt 對(duì)象序列化/反序列化

    閱讀本文大概需要 3 分鐘 日常開(kāi)發(fā)過(guò)程中,避免不了對(duì)象序列化和反序列化,如果你使用 Qt 進(jìn)行開(kāi)發(fā),那么有一種方法實(shí)現(xiàn)起來(lái)非常簡(jiǎn)單和容易。 我們知道 Qt 的元對(duì)象系統(tǒng)非常強(qiáng)大,基于此屬性我們可以實(shí)現(xiàn)對(duì)象的序列化和反序列化操作。 比如有一個(gè)學(xué)生類,包含以下幾

    2024年02月13日
    瀏覽(27)
  • 什么是序列化和反序列化?

    JSON(JavaScript Object Notation)和XML(eXtensible Markup Language)是兩種常用的數(shù)據(jù)交換格式,用于在不同系統(tǒng)之間傳輸和存儲(chǔ)數(shù)據(jù)。 JSON是一種輕量級(jí)的數(shù)據(jù)交換格式,它使用易于理解的鍵值對(duì)的形式表示數(shù)據(jù)。JSON數(shù)據(jù)結(jié)構(gòu)簡(jiǎn)單明了,易于讀寫(xiě)和解析,是基于JavaScript的一種常用數(shù)據(jù)

    2024年02月09日
    瀏覽(29)
  • jackson自定義序列化反序列化

    自定義序列化 序列化主要作用在返回?cái)?shù)據(jù)的時(shí)候 以BigDecimal統(tǒng)一返回3位小數(shù)為例 自定義序列化處理類 繼承jackson的 JsonSerializer 類,重寫(xiě) serialize 方法 使用的時(shí)候,可以直接使用Jackson的 @JsonSerialize 注解 自定義反序列化 接收前端傳入數(shù)據(jù) 繼承 JsonDeserializer 類,重寫(xiě) deserializ

    2024年02月13日
    瀏覽(23)
  • 【Linux】序列化與反序列化

    【Linux】序列化與反序列化

    目錄 前言 什么是應(yīng)用層? 再談\\\"協(xié)議\\\" ?什么是序列化和反序列化 網(wǎng)絡(luò)版計(jì)算器 整體流程實(shí)現(xiàn) Sock.hpp的實(shí)現(xiàn) TcpServer.hpp的實(shí)現(xiàn) Protocol.hpp的實(shí)現(xiàn) CalServer.cc的編寫(xiě) CalClient.cc的編寫(xiě) 整體代碼 ? ????????本章是屬于TCP/UDP四層模型中的第一層 應(yīng)用層 相關(guān)的內(nèi)容。主要介紹了序列

    2024年02月10日
    瀏覽(19)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包