java反序列化 网规_对于实现特定特性的所有类型,我如何大规模实现反序列化?...
我正在用serde反序列化yaml配置文件。对于我反序列化到的大多数结构,事情都很简单,结构的字段和我的yaml文件中的属性之间有一对一的关系。
在一些情况下,事情会更复杂一些。对于这些,可以更好地将yaml文件中的属性视为构造函数的参数。实际结构将具有不同的字段,根据这些字段进行计算。
对于这些情况,我编写了单独的配置结构,并将其反序列化为。为了简单起见,考虑下面这个愚蠢的例子:
struct Message {
text: String,
}
impl Message {
fn from_config(config: MessageConfig) -> Message {
Message {
text: format!("{} {}", config.first_half, config.second_half),
}
}
}
#[derive(Deserialize)]
struct MessageConfig {
first_half: String,
second_half: String,
}
让塞尔德从
MessageConfig
到
Message
对我来说,我实现了
Deserialize
对于
消息
:
impl Deserialize for Message {
fn deserialize(deserializer: D) -> Result
where
D: Deserializer,
{
MessageConfig::deserialize(deserializer).map(|config| Message::from_config(config))
}
}
这是可行的,但是如果我要为每个结构执行此操作,将涉及大量反序列化代码的复制粘贴,因此我认为应该利用它来创建一个特性:
use serde::{Deserialize, Deserializer};
use serde_json;
#[macro_use]
extern crate serde_derive;
trait Configurable {
type Config;
fn from_config(config: Self::Config) -> Self;
}
impl Deserialize for T
where
T: Configurable,
C: Deserialize,
{
fn deserialize(deserializer: D) -> Result
where
D: Deserializer,
{
Self::Config::deserialize(deserializer).map(|config| Self::from_config(config))
}
}
struct Message {
text: String,
}
impl Configurable for Message {
type Config = MessageConfig;
fn from_config(config: MessageConfig) -> Message {
Message {
text: format!("{} {}", config.first_half, config.second_half),
}
}
}
#[derive(Deserialize)]
struct MessageConfig {
first_half: String,
second_half: String,
}
但是,编译器对此并不满意:
error[E0119]: conflicting implementations of trait `_IMPL_DESERIALIZE_FOR_MessageConfig::_serde::Deserialize` for type `std::boxed::Box<_>`:
--> src/lib.rs:11:1
|
11 | / impl Deserialize for T
12 | | where
13 | | T: Configurable,
14 | | C: Deserialize,
... |
21 | | }
22 | | }
| |_^
|
= note: conflicting implementation in crate `serde`:
- impl _IMPL_DESERIALIZE_FOR_MessageConfig::_serde::Deserialize for std::boxed::Box
where T: _IMPL_DESERIALIZE_FOR_MessageConfig::_serde::Deserialize;
= note: downstream crates may implement trait `Configurable` for type `std::boxed::Box<_>`
error[E0210]: type parameter `T` must be used as the type parameter for some local type (e.g. `MyStruct`)
--> src/lib.rs:11:1
|
11 | / impl Deserialize for T
12 | | where
13 | | T: Configurable,
14 | | C: Deserialize,
... |
21 | | }
22 | | }
| |_^ type parameter `T` must be used as the type parameter for some local type
|
= note: only traits defined in the current crate can be implemented for a type parameter
这些错误信息对我来说毫无意义。什么?
Box
有什么关系吗?有没有可能让这种特质发挥作用?
总结
以上是生活随笔为你收集整理的java反序列化 网规_对于实现特定特性的所有类型,我如何大规模实现反序列化?...的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 后续不再生产,惠普宣布面向开发者、预装
- 下一篇: 在Matlab命令窗口中执行,交互式命令