1

AFAIK 在 Rust 中没有(灵活且稳定的)ASN.1 {ser,deser}ialization 库,所以我正在考虑制作一个(同时学习 Rust)。我的目标是在 Rust 中实现 SNMP (v1-v3) 客户端。

在从头开始之前,我想问问 Serde 团队或有经验的 Serde 用户是否可以使用 Serde 实现 ASN.1 编解码器。问题是 ASN.1 中的每个对象都有自己的标头 ( TAG+ LENGTH),其中TAG是用户为每种类型定义的,因此 iXX 或 uXX 或 bytes 或任何可以是 any TAG

ASN.1 对象由和tag组成。ASN.1 有一组用于整数、浮点数、字节串(以及 ASCII 字符串)等的通用(默认)标签。对于原始类型,我可以坚持使用通用标签,但对于非原始类型(元组、新类型、结构)等)该类型应该具有特征的实现,提供标签和自定义序列化/反序列化功能。lengthpayloadAsn1Info

{ser,deser}原始类型的序列化是微不足道的,但是我如何为复杂的结构(或新类型)实现它?他们一定Asn1Info

我查看了asn1-cereal库。它看起来像一个不错的 ASN.1 实现,提供了有用的宏和东西。我不妨继续努力,而不是从头开始编写所有内容。

假设tagu8并且 Asn1Info 特征看起来像这样:

pub trait Asn1Info {
  fn asn1_tag() -> u8;
}

然后我有一个新类型,就像pub struct Counter(u32)它自己的应用程序特定标签一样。然后我会像这样为 Counter 做一个 impl:

impl Asn1Info for Counter {
    fn asn1_tag() -> u8 {
        0x41
    }
}

现在如何在0x41不手动实现Serialize特征的情况下使用标签对其进行序列化?无法向 中注入额外信息Serializer,因此我无法重用其中的所有非原始序列化方法(如serialize_newtype_variant)。如果我不能SerializerSerializetrait impl 中为自定义 ASN.1 对象(特定于应用程序、特定于上下文等)使用方法,那么就没有办法(或没有意义)使用 Serde 实现有用的 ASN.1 编解码器,不是是吗?

4

0 回答 0