Rust 是否可以使用Serde实施ASN.1除锈程序?

Rust 是否可以使用Serde实施ASN.1除锈程序?,rust,asn.1,serde,Rust,Asn.1,Serde,另外,Rust中没有(灵活且稳定的)ASN.1{ser,反序列化库,所以我正在研究制作一个(同时学习Rust)。我的目标是在Rust中实现SNMP(v1-v3)客户端 在从头开始之前,我想询问Serde团队或有经验的Serde用户是否可以使用Serde实现ASN.1编解码器。问题是ASN.1中的每个对象都有自己的头(TAG+LENGTH),其中TAG是用户为每种类型定义的,所以iXX或uXX或字节或任何标记都可以 ASN.1对象由标记、长度和有效载荷组成。ASN.1有一组用于整数、浮点数、ByT

另外,Rust中没有(灵活且稳定的)ASN.1{ser,反序列化库,所以我正在研究制作一个(同时学习Rust)。我的目标是在Rust中实现SNMP(v1-v3)客户端

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

ASN.1对象由
标记
长度
有效载荷
组成。ASN.1有一组用于整数、浮点数、ByTestRing(以及ASCII字符串)等的通用(默认)标记。对于基本类型,我可以坚持使用通用标记,但对于非基本类型(元组、新类型、结构等),该类型应具有
Asn1Info
trait的实现,提供标记和自定义序列化/反序列化功能

原语类型的{ser,deser}序列化很简单,但是如何为复杂结构(或新类型)实现它呢?它们必须是
Asn1Info

我已经查过图书馆了。它看起来像一个像样的ASN.1实现,提供了有用的宏和其他东西。我不妨把它写下来,而不是从头开始写

让我们假设
标记
u8
,Asn1Info特征如下所示:

pub trait Asn1Info {
  fn asn1_tag() -> u8;
}
impl Asn1Info for Counter {
    fn asn1_tag() -> u8 {
        0x41
    }
}
然后我有了一个新类型,比如
pub-struct-Counter(u32)
,它有自己的特定于应用程序的标记。然后我会为计数器制作一个impl,如下所示:

pub trait Asn1Info {
  fn asn1_tag() -> u8;
}
impl Asn1Info for Counter {
    fn asn1_tag() -> u8 {
        0x41
    }
}
现在,我如何使用标记
0x41
序列化它,而不手动实现
serialize
trait?无法将附加信息注入到
序列化程序
,因此我无法重用其中的所有非原语序列化方法(如
serialize\u newtype\u variant
)。
如果我不能对自定义ASN.1对象(特定于应用程序、特定于上下文等)使用
Serialize
trait impl中的
Serializer
方法,那么就没有办法(或没有意义)用Serde实现有用的ASN.1编解码器,不是吗?

我认为用Serde实现ASN.1编解码器是完全可能的。但是你需要选择一种特定的格式(BER,DER,…),你可能只能在这些格式之间共享很少的代码。你能把你的问题说得更具体一些吗?@E_net4,现在应该有足够的信息了。谢谢你的回复!你似乎太依赖于一种特性而不是结构。如果你专注于对每种复杂类型实现
序列化
,还会有问题吗?@oli_obk:你可以共享一堆代码,DER(CER)和BER之间的主要区别是BER允许流式传输(长度未知的结构,使用结束标记而不是大小),而DER(CER)要求事先知道尺寸。这就像Dubuisson的书中的2-4页(免费;)。现在,PER和XER肯定“更有趣”;-)我认为用serde实现ASN.1编解码器是完全可能的。但是你需要选择一种特定的格式(BER,DER,…),你可能只能在这些格式之间共享很少的代码。你能把你的问题说得更具体一些吗?@E_net4,现在应该有足够的信息了。谢谢你的回复!你似乎太依赖于一种特性而不是结构。如果你专注于对每种复杂类型实现
序列化
,还会有问题吗?@oli_obk:你可以共享一堆代码,DER(CER)和BER之间的主要区别是BER允许流式传输(长度未知的结构,使用结束标记而不是大小),而DER(CER)要求事先知道尺寸。这就像Dubuisson的书中的2-4页(免费;)。现在,PER和XER肯定“更有趣”;-)