欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

java反序列化 网规_对于实现特定特性的所有类型,我如何大规模实现反序列化?...

发布时间:2023/12/15 编程问答 45 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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反序列化 网规_对于实现特定特性的所有类型,我如何大规模实现反序列化?...的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。