我正在用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反序列化 网规_对于实现特定特性的所有类型,我如何大规模实现反序列化?...相关推荐

  1. java 开源网盘_现在的开源网盘还有哪些推荐?

    在此推荐一个用Java编写的.简洁完善的开源云盘系统:kiftd 这是一个主要面向家庭.团队.小型组织的网盘搭建系统,开源免费(源代码在GitHub上),体积不大(不超过200MB),安装和使用非常简 ...

  2. java旅游网项目_基于jsp的旅游网-JavaEE实现旅游网 - java项目源码

    基于jsp+servlet+pojo+mysql实现一个javaee/javaweb的旅游网, 该项目可用各类java课程设计大作业中, 旅游网的系统架构分为前后台两部分, 最终实现在线上进行旅游网各 ...

  3. java 知网爬虫_怎样抓取中国知网数据

    2,快捷采集的使用方法:如何使用快捷采集 在中国知网通过高级检索,输入关键词后抓取相关文章的标题.作者.摘要.关键词等信息.但是中国知网在输入关键词搜索后网址并不会发生变化,所以在抓取的时候我们需要爬 ...

  4. 情怀java手机网游_经典端游移植手游 “情怀”赋予老IP全新活力

    原标题:经典端游移植手游 "情怀"赋予老IP全新活力 腾讯旗下<天涯明月刀>手游在近日开始了封测,这款经典的国产网游也正式加入了手游的大家庭中,事实上很多知名的网络游戏 ...

  5. java 断网处理_如何处理浏览器的断网情况?

    好的断网处理会让人很舒适:lol的断线重连,王者荣耀的断线重连 可以确保游戏的继续进行 坏的断网处理甚至不处理会出bug:比如我手上的项目就出了个bug 业务人员表示非常苦恼 网络问题一直是一个很值得 ...

  6. 博学谷java百度网盘_博学谷javaee就业班2020百度云

    线程在面试中已经是常客了,也是我们必备的知识点,关于线程,问的最多的便是线程是什么?为什么使用多线程?多线程的示例以及解决方案?线程池是什么? 一.线程是什么? Thread类中有这样的明确定义:线程 ...

  7. java 断网处理_博客大巴劫后重生:断网10日后恢复访问(图)

    重新上线的博客大巴首页 博客大巴昨日发表公告 1月14日上午消息,在断网长达十天之后,博客大巴(http://www.blogbus.com/)昨晚终于恢复访问.此前多日,与博客大巴一起出现访问故障的 ...

  8. java正则表达式不包含-_不包含特定字符串的Java正则表达式。

    示例import java.util.regex.*; class PatternMatch{ public static void main(String args[]) { String cont ...

  9. 博学谷java百度网盘_博学谷javaee在线就业班2020网盘

    一:为什么要学多线程 应付面试 :多线程几乎是面试中必问的题,所以掌握一定的基础知识是必须的. 了解并发编程:实际工作中很少写多线程的代码,这部分代码一般都被人封装起来了,在业务中使用多线程的机会也不 ...

最新文章

  1. 关于--Error: User Command terminated, Exit-Code = 1解决办法
  2. 写一个ajax框架,自己写的一个ajax框架,希望大家多提意见
  3. 【Ubuntu入门到精通系列讲解】远程管理常用命令速查
  4. windows 技巧篇-查看文件夹被那个进程占用,文件夹占用解除方法
  5. python编译安装pyaudio
  6. 105.敏捷开发模型
  7. 只需20小时,让0基础的你掌握小程序云开发!这个暑假,约否?
  8. AngularJS与Angular的区别
  9. MySQL乱码问题如何排查
  10. LeetCode-1052:爱生气的书店老板
  11. cmd无法运行python_通过Java-%1在cmd中运行python文件不是有效的Win32应用程序 - java...
  12. 新思路计算机一级百度云,新思路全国计算机一级考试选择题(含解析和答案)合并(1)...
  13. NLP简报(Issue #3)
  14. 【学术杂谈】博士毕业都去哪儿了,谈谈学术的这条路该如何走
  15. 74ls175四人抢答器电路图_用数字电路实现四人抢答器
  16. 易基因 | 表观技术:单细胞及微量细胞全基因组重亚硫酸盐甲基化测序(scWGBS)
  17. NoSQLBooster for MongoDB基本使用步骤
  18. 逻辑上的“谬误”真的是我们应该所认为的错误吗?
  19. Qt主线程和工作线程更新界面问题
  20. 淘宝API:item_get_app - 获得淘宝app商品详情原数据

热门文章

  1. html网页原理,html运行原理
  2. 文档如何清除html,html清除浏览器缓存.docx
  3. 服务器引导顺序,docker compose 服务启动顺序控制的方法
  4. php中update语句修改多个字段,Myabtis中批量更新update多字段
  5. python训练手势分类器_使用Pytorch训练分类器详解(附python演练)
  6. 20220202--CTF刷题MISC方向--第5题--反编译
  7. 国外基于android的系统,基于Android的位置服务系统设计与实现
  8. eggjs的参数校验模块egg-validate的使用和进一步定制化升级
  9. 微信小程序 获取用户信息并保存登录状态
  10. The podfile