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反序列化 网规_对于实现特定特性的所有类型,我如何大规模实现反序列化?...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 后续不再生产,惠普宣布面向开发者、预装
- 下一篇: php 如何设计索引_Mysql学习浅谈