Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust serde:顶层的有状态反序列化_Rust_Serde - Fatal编程技术网

Rust serde:顶层的有状态反序列化

Rust serde:顶层的有状态反序列化,rust,serde,Rust,Serde,我试图反序列化一个二进制格式(),它由多个表(二进制结构)中的数据组成。我希望能够独立地反序列化这些表(因为它们是如何存储在顶级文件结构中的;假设它们位于单独的文件中,因此必须单独反序列化),但有时它们之间存在依赖关系 一个简单的例子是loca表,该表包含16位或32位偏移量的数组,具体取决于head表中indextolcformat字段的值。作为更复杂的示例,这些loca表格偏移量依次用作glyf表格二进制数据的偏移量,以定位元素。因此,我需要以某种方式将indextolcformat和loc

我试图反序列化一个二进制格式(),它由多个表(二进制结构)中的数据组成。我希望能够独立地反序列化这些表(因为它们是如何存储在顶级文件结构中的;假设它们位于单独的文件中,因此必须单独反序列化),但有时它们之间存在依赖关系

一个简单的例子是
loca
表,该表包含16位或32位偏移量的数组,具体取决于
head
表中
indextolcformat
字段的值。作为更复杂的示例,这些
loca
表格偏移量依次用作
glyf
表格二进制数据的偏移量,以定位元素。因此,我需要以某种方式将
indextolcformat
loca:Vec
“放入”序列化程序

显然,我需要自己实现
反序列化
并编写访问者,而我已经开始着手做这件事了。当表与子表之间存在依赖关系时,我还可以在表的访问者中使用
反序列化\u seed
来解决这个问题。但我不知道如何应用它在表之间传递信息

我认为在构建序列化程序对象时,我需要存储本质上是配置信息的内容(index-code>indexToLocFormat
,偏移量数组的值):


pub-struct反序列化器访问者实际上,我想我已经找到了。诀窍是分阶段进行反序列化。不要调用反序列化器模块的
from_bytes
函数(它包装结构创建和
T::反序列化
调用),而是执行以下操作:

使用serde::de::反序列化种子;//在范围内具备这一特点也是关键
让mut de=反序列化器::from_字节(&binary_loca_表);
让ssd:SomeSpecialistDeserializer{…配置在这里..};
让loca_table:Vec=ssd.反序列化(&mut de).unwrap();
在本例中,我使用如下定义的
LocaDeserializer

pub-struct-LocaDeserializer{locaIs32Bit:bool}
LocaDeserializer的impl{
类型值=Vec;
fn反序列化(self,反序列化器:D)->std::result::result
哪里
D:serde::de::反序列化器访问者,
{
如果self.locais32位{
Ok(seq.next_元素::()?.Ok_或_else(| serde::de::Error::custom(格式!(“需要32位字形偏移”))?)
}否则{
Ok(seq.next_元素::()?.Ok_或_else(| | serde::de::Error::custom(格式!(“需要16位字形偏移”)))?
.国际热核实验堆(iter)
.map(|x |(*x为u32)*2)
.collect())
}
}
}
反序列化程序。反序列化顺序(LocaDeserializerVisitor{
locaIs32Bit:self.locaIs32Bit,
})
}
}
现在:

fn失水(){
让二进制=向量[
0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,
];
让mut de=反序列化器::from_字节(&binary_loca);
设cs:loca::LocaDeserializer=loca::LocaDeserializer{locaIs32Bit:false};
让floca:Vec=cs.反序列化(&mut de).unwrap();
println!(“{:?}”,floca);
// [2, 0, 2, 0, 0, 52]
让mut de=反序列化器::from_字节(&binary_loca);
设cs:loca::LocaDeserializer=loca::LocaDeserializer{locaIs32Bit:true};
让floca:Vec=cs.反序列化(&mut de).unwrap();
println!(“{:?}”,floca);
// [65536, 65536, 26]
}
塞德是非常好的-一旦你有你的头脑围绕它