7 个版本

0.1.7 2024年4月26日
0.1.6 2023年5月18日
0.1.2 2022年10月7日
0.1.1 2022年6月14日
0.1.0 2022年5月9日

#173 in 编码

Download history 28/week @ 2024-05-03 24/week @ 2024-05-10 62/week @ 2024-05-17 25/week @ 2024-05-24 32/week @ 2024-05-31 22/week @ 2024-06-07 29/week @ 2024-06-14 23/week @ 2024-06-21 37/week @ 2024-06-28 99/week @ 2024-07-05 43/week @ 2024-07-12 36/week @ 2024-07-19 121/week @ 2024-07-26 32/week @ 2024-08-02 21/week @ 2024-08-09 56/week @ 2024-08-16

235 每月下载量
用于 2 crates

Apache-2.0

265KB
6.5K SLoC

Latest Version Documentation License

DLHN

DLHN 是一种非常快速且小巧的数据序列化格式。
规范

概述

DLHN (发音与 "Dullahan" 相同) 是一种由 JSON、CSV、MessagePack 和 Protocol Buffers 启发,语言和平台无关的二进制序列化格式。它旨在以最小的数据大小实现快速的序列化和反序列化,无需 schema 文件。然而,我们也在考虑未来支持 schema 文件。

快速入门

[dependencies]
dlhn = "0.1"

序列化和反序列化正文

use dlhn::{Deserializer, Serializer};
use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize, PartialEq, Debug)]
struct Test {
    a: bool,
    b: u8,
    c: String,
}

fn main() {
    let body = Test {
        a: true,
        b: 123,
        c: "test".to_string(),
    };

    // Serialize body
    let mut output = Vec::new();
    let mut serializer = Serializer::new(&mut output);
    body.serialize(&mut serializer).unwrap();

    // Deserialize body
    let mut reader = output.as_slice();
    let mut deserializer = Deserializer::new(&mut reader);
    let deserialized_body = Test::deserialize(&mut deserializer).unwrap();

    assert_eq!(body, deserialized_body);
}

序列化和反序列化头部

use dlhn::{DeserializeHeader, SerializeHeader, Header};

#[derive(SerializeHeader)]
struct Test {
    a: bool,
    b: u8,
    c: String,
}

fn main() {
    let mut output = Vec::new();

    // Serialize header
    Test::serialize_header(&mut output).unwrap();
    assert_eq!(
        output,
        [
            21, // Tuple code
            3,  // Tuple size
            2,  // Boolean code
            3,  // UInt8 code
            18, // String code
        ]
    );

    // Deserialize header
    let deserialized_header = output.as_slice().deserialize_header().unwrap();
    assert_eq!(
        deserialized_header,
        Header::Tuple(vec![Header::Boolean, Header::UInt8, Header::String])
    );
}

流版本序列化和反序列化正文

use dlhn::{de::Error, Deserializer, Serializer};
use serde::{Deserialize, Serialize};

fn main() {
    let mut output = Vec::new();

    // Serialize body
    let mut serializer = Serializer::new(&mut output);
    true.serialize(&mut serializer).unwrap();
    false.serialize(&mut serializer).unwrap();
    assert_eq!(output, [1, 0]);

    // Deserialize body
    let mut reader = output.as_slice();
    let mut deserializer = Deserializer::new(&mut reader);
    assert_eq!(bool::deserialize(&mut deserializer), Ok(true));
    assert_eq!(bool::deserialize(&mut deserializer), Ok(false));
    assert_eq!(bool::deserialize(&mut deserializer), Err(Error::Read));
}

基准测试

Rust 序列化基准测试

版权 2020-2022 Shogo Otake

许可协议:Apache License, Version 2.0 (以下简称 "许可证");除非符合许可证规定或书面同意,否则不得使用此文件。您可以在以下地址获取许可证副本:

http://www.apache.org/licenses/LICENSE-2.0

除非适用法律要求或书面同意,否则在许可证下分发的软件按 "原样" 提供,不提供任何明示或暗示的保证或条件。有关许可证的具体语言、权限和限制,请参阅许可证。

依赖项

~3.5MB
~72K SLoC