日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

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

编程问答

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

發布時間:2023/12/15 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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反序列化 网规_对于实现特定特性的所有类型,我如何大规模实现反序列化?...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。