首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

干货 | 携程机票 App KMM 跨端生产实践

已经是 release 状态,是目前极少数能用于 KMM 的 JSON 序列化库,但 kotlinx.serialization-protobuf 目前还处于 beta 阶段,使用时需加强自动化测试场景覆盖...框架上层分别以 Java 以及 Objective-C 实现,不仅仅包含网络请求本身,还封装了包括 Protobuf2 在内的各类数据的序列化与反序列化代码。...二进制数据返回给框架用户,这样我们就可以在 KMM 工程内使用 kotlinx.serialization 进行序列化或反序列化。...= b as T } 这段代码本应该直接 crash,但运行后却奇迹般的打印出了“123”,也就是说,我们居然用 B 类型的对象调用了 A 类型的成员函数。出现这种离奇现象的唯一解释就是 a?....但我们再考虑以下代码: object MyObject { val hashMap = HashMap() } 编译器不会抛出任何警告,但一旦我们在运行时

3.3K10

Spring认证中国教育管理中心-Spring Data MongoDB教程十五

本地时间类型(例如LocalDateTimeto java.util.Date)的默认转换器依赖于系统默认时区设置在这些类型之间进行转换。您可以通过注册您自己的转换器来覆盖默认转换器。...转换器消歧 通常,我们会检查Converter它们相互转换的源和目标类型的实现。根据其中一个是否是底层数据访问 API 可以本地处理的类型,我们将转换器实例注册为读取或写入转换器。...默认情况下,来自 Kotlin 中使用的 Java API 的类型被识别为平台类型其进行空检查。...Kotlin JSR-305 注释和 Spring 可空性注释的支持为Kotlin 开发人员提供了整个 Spring Data API 的空安全,具有null在编译处理相关问题的优势。...Spring Data 模块在以下范围内提供协程的支持: Kotlin 扩展中的延迟和流返回值支持 20.5.1.依赖关系 协同程序支持启用kotlinx-coroutines-core, kotlinx-coroutines-reactive

2.3K30
您找到你想要的搜索结果了吗?
是的
没有找到

还在被数据类的序列化折磨?是时候丢弃 Gson 了

它作为一套专门为 Kotlin 的类开发的序列化框架,自然要兼顾到 Kotlin 的类型的各种特性,你会发现用 Gson 来序列化 Kotlin 类遇到的奇怪的问题在这里都没了。...不过你如果直接使用 IntelliJ 的运行按钮,你就会发现一个编译错误,看起来就是什么版本不兼容啦之类的。...MyDate 的对象按数组的形式输出,而 load 方法则用于反序列化。...结果嘛,当然就是 Gson 没有 c 做任何初始化的操作。 ? 你当然可以骂 Gson “你瞎啊,那么明显的构造都不会执行?”,Gson 回复你的估计仍然是: ?...小结 序列化 Kotlin 数据类型的时候,以后可以考虑使用 kotlinx.serialization 这个框架了,它不仅 API 简单,还解决了我们经常遇到用别的 Java 框架带来的问题。

2.2K10

Android使用Retrofit进行网络请求及和Kotlin结合使用

使用 @Part 用于表单字段,Part和PartMap与@multipart注解结合使用,适合文件上传的情况 @PartMap 用于表单字段,默认接受类型是Map<String,RequestBody...请求中的参数 @QueryMap 与Query类似,用于不确定表单参数 @Url 指定请求路径 请求和响应格式(标记)注解 标记类注解 说明 @FormUrlEncoded 表示请求发送编码表单数据,每个键值需要使用...@Filed注解 @Multipart 表示请求发送form_encoded数据(使用于有文件上传的场景),每个键值需要用@Part来注解键名,随后的对象需要提供值 @Streaming 表示响应用字节流的形式返回...,如果没有使用注解,默认会把数据全部载入到内存中,该注解在下载大文件特别有用 参数示例 URL上的参数 @GET("user") Call getData2(@Query...file.exists()) { file.mkdir(); } //将文件转化为RequestBody对象 //需要在表单中进行文件上传,就需要使用该格式:multipart/form-data

94910

「首席架构师看Event Hub」Kafka的Spring 深入挖掘 -第1部分

SeekToCurrentErrorHandler丢弃轮询()中的剩余记录,并在使用者上执行查找操作来重置偏移量,以便在下一次轮询再次获取被丢弃的记录。...此反序列化器包装委托反序列化器并捕获任何异常。然后将它们转发给侦听器容器,后者将它们直接发送给错误处理程序。异常包含源数据,因此可以诊断问题。...消息转换器bean推断要转换为方法签名中的参数类型类型转换器自动“信任”类型。Spring Boot自动将转换器配置到侦听器容器中。...此外,由于我们没有推断类型,所以需要将消息转换器配置为“信任”映射类型的包。 在本例中,我们将在两端使用消息转换器(以及StringSerializer和StringDeserializer)。...注意,我们必须告诉它使用TYPE_ID头来确定转换的类型。同样,Spring Boot会自动将消息转换器配置到容器中。下面是应用程序片段中的生产端类型映射。

1.4K40

第四十八章:SpringBoot2.0新特性 - RabbitMQ信任package设置本章目标SpringBoot 企业级核心技术学习专题构建项目总结

在这次SpringBoot升级后,之前的系统内使用实体传输受到了限制,如果使用SpringBoot默认的序列化方式不会出现信任package的问题,之所以出现这个问题是因为项目使用fastjson方式进行类的序列化已经反序列化...类配置监听的队列都是字符串的形式,这样后期修改时还要修改多个地方(当然队列信息很少变动),我们本章使用Constants常量的形式进行配置,如下所示: /** * 队列常量配置 * @author...我们在之前说了只有传递实体类才会出现信任package问题,下面我们需要创建一个简单的消息传输实体,如下所示: /** * 消息实体 * * @author:于起宇 * =====...,下面我们RabbitMQ添加自定义MessageConverter的配置,使用fastjson替代默认转换方式。...总结 如果使用RabbitMQ默认的转换方式,并不会涉及到本章遇到的信任package问题,如果想自定义消息转换并且使用DefaultClassMapper作为映射,肯定会出现信任package的问题,

1.2K40

Liferay Portal Json Web Service 反序列化漏洞(CVE-2020-7961)

01 JODD序列化与反序列化 参考官方使用手册,先看下JODD的直接序列化与反序列化: TestObject.java package com.longofo; import java.util.HashMap...={aaa=bbb}} 在Test.java中,使用了两种方式,第一种是常用的使用方式,在反序列化时指定根类型(rootType);而第二种官方也不推荐这样使用,存在安全问题,假设某个应用提供了接收JODD...Json的地方,并且使用了第二种方式,那么就可以任意指定类型进行反序列化了,不过Liferay这个漏洞给并不是这个原因造成的,它并没有使用setClassMetadataName("class")这种方式...> type) {//设置转换器,和下面的设置全局转换器类似,不过这里可以传入自定义的转换器(比如将某个类的Data field,格式为03/27/2020,序列化时转为2020-03-27)...JSONDeserializer transform(JSONDeserializerTransformer jsonDeserializerTransformer, String field) {//反序列化使用转换器

1.4K20

【SpringBoot MQ 系列】RabbitMq 消息发送基本使用姿势

,看一下SpringBoot的环境下,如何玩转rabbitmq 本篇内容主要为消息发送,包括以下几点 RabbitTemplate 发送消息的基本使用姿势 自定义消息基本属性 自定义消息转换器AbstractMessageConverter...,不同的exchange类型发送端的使用姿势影响并不大,有影响的是消费者) public class MqConstants { public static final String exchange...非序列化对象发送异常case 通过查看rabbitTemplate#convertAndSend的接口定义,我们知道发送的消息可以是Object类型,那么是不是意味着任何对象,都可以推送给mq呢?...为什么会出现这个问题呢?...(这里使用的是jdk的序列化方式来实现对象和byte数组之间的互转) 所以我们传递一个非序列化的对象会参数非法的异常 自然而然的,我们会想有没有其他的MessageConverter来友好的支持任何类型的对象

1.1K40

我攻克的技术难题:深入解析 JackJSON 底层原理及个性化处理返回值中的默认 null 值

要求不能缺少任何字段,并且字段的值不能为null。为了实现这个需求,我开始思考如何在Spring Boot中自定义Jackson序列化器。首先,我会先尝试实现这个功能,然后再深入研究源代码。...我们可以编写自定义的序列化方法,以确保在序列化过程中不会出现任何错误。...在我们的配置类中,我们遍历已经获取到的converters,并我们想要的转换器进行修改和添加。那么修改完成后,它在哪里起作用呢?...因此,在调用changeProperties方法,我们可以对null值的序列化进行修改。...同时,我们还返回了一个list类型的BeanPropertyWriter,这就解释了为什么在解析,该BeanPropertyWriter是一个数组类型,因为不同字段的解析方式是不同的。

37621

一站式解决使用枚举的各种痛点

因此,我们需要自己来扩展相应的转化机制,这其中包括: SpringMVC 枚举转换器 ORM 枚举映射 JSON 序列化和反序列化 自定义 SpringMVC 枚举转换器 明确需求 以上文的 CourseType...另外,在给前端输出 VO ,默认情况下,还是要手动把枚举类型映射成 Integer 类型,并不能在 VO 中直接使用枚举输出。...,SpringMVC 默认也是使用 Jackson 作为其 JSON 转换器。...经过上述的一些自定义转换器,基本解决了在代码中使用枚举的一些痛点。...现在大部分的代码都在使用 swagger 来编写文档,不知道大家有没有这样的痛点: 在编写文档,需要告诉前端枚举类型有哪些取值,每次增加取值之后,不仅要改代码,还要找到对应的取值在哪里使用了,然后修改

1.7K20

【SpringBoot技术专题】「实战指南」从实战开发角度去分析操作RestTemplate的应用及使用技巧

RestTemplate默认使用Jackson JSON库进行对象序列化和反序列化。RestTemplate在异常处理和错误处理方面提供了优秀的支持。...当我们调用这个方法,RestTemplate将自动使用Jackson JSON库将JSON响应映射到我们的WeatherReport类。...需要注意的是,这里我们没有指定使用任何参数,也没有传递任何Http请求头,使用RestTemplate像这样发送数据是非常方便的。...响应体:{ "name": "zhaoxb", "id": 1}发送POST请求用post方法发送带参的请求,Map不能被定义为 HashMap、LinkedHashMap,而应被定义为...jackson 来实现序列化和反序列化,默认情况下会注册MIME类型转换器,但可以通过 setMessageConverters 函数指定其他类型的转化器。

1.5K20

Spring RestTemplate为何必须搭配MultiValueMap?

#doWithRequest 根据当前要提交的 Body 内容,遍历当前支持的所有编解码器: 若找到合适编解码器,用之完成 Body 转化 看下 JSON 的编解码器是否合适的判断 AbstractJackson2HttpMessageConverter...#canWrite 可见,当使用BodyHashMap,是可完成 JSON 序列化的。...所以后续将这个表单序列化为请求 Body了。 但我还是疑问,为何适应表单处理的编解码器不行?...原来使用 RestTemplate 提交表单必须是 MultiValueMap! 而我们案例定义的就是普通的 HashMap,最终是按请求 Body 的方式发送出去的。...修正 换成 MultiValueMap 类型存储表单数据即可: 修正后,表单数据最终使用下面的代码进行了编码: FormHttpMessageConverter#write 发送出的数据截图如下

1.2K30

关于 Kotlin Coroutines, 你可能会犯的 7 个错误

但是,我发现了许多开发者在使用协程时会犯一些通用性的错误。 1. 在使用协程实例化一个新的 Job 实例 有时候你会需要一个 job 来协程进行一些操作,例如,稍后取消。...错误使用 SupervisorJob 有时候你会使用 SupervisorJob 来达到下面的效果: 在 job 继承体系中停止异常向上传播 当一个协程失败不影响其他的同级协程 由于协程构建器 launch...launch(SupervisorJob()){ // Coroutine Body } 但是,就像错误 1 ,这样会打破结构化并发的取消机制。...进行网络请求或者数据库查询切换调度器 这一项并不真的是一个 “错误” ,但是仍可能让你的代码难以理解,甚至更加低效。...在子协程中使用 CoroutineExceptionHandler 再来一条简明扼要的:在子协程的构建器中使用 CoroutineExceptionHandler 不会有任何效果。

91320

Java EE实用教程笔记----(4)第四章 第4章 Struts 2类型转换及输入校验

但若程序员自定义类型转换器,则要根据情况判断。 集合:在使用集合类型转换器,如果集合中的数据无法确定,可以先将其封装到一个String类型的集合中,然后在用到某个元素再进行手动转换。...第二部分 自定义类型转换器 4.2.1 继承DefaultTypeConverter类实现转换器 本小节实例需要实现的功能:在左图的输入栏输入一个正确完整的电话后,单击【提交】按钮,出现如右图所示的界面...同时类型转换器也需要稍作修改: ? 运行后,结果如图所示: ? 4.3.2 集合类型转换器 集合类型和数组类型差不多,也需要使用局部类型转换器,可以在【实例4.3】基础上稍做修改转换为集合类型。...若输入“username”的值再单击【提交】按钮,则出现“password为空”的错误提示信息,如下图所示: ?...1.使用标签 ? 例如,username字段进行非空校验,应配置为: ? 2.使用标签 ?

73220

Android使用Flow检测版本升级自动下载安装

# 整体介绍 1 网络通讯用的retrofit2 2 类的JSON用的GSON 3 下载的状态显示更新用的kotlin Flow,这也是我第一次用Flow排坑也用了些时间,不过使用起来确实感觉简单好多...0-每次注册登记 1-按每次访问的URL登记 public static int Cookiestype = 0; //Cookies类型如果为每次注册登记时用到检索关键前...import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.conflate import kotlinx.coroutines.flow.flow...throw it }.conflate() //conflate() 对应 LATEST 策略,如果缓存池满了,新数据会覆盖老数据 } //使用协程需要加关键字...map等属于中间运算符,可在应用于数据流,设置一系列暂不执行的链式运算,留待将来使用执行。仅将一个中间运算符应用于数据流不会启动数据流收集。 collect等终端运算符可触发数据流开始监听值。

95830

Hessian 反序列化及相关利用链

有的处理器在支持多态特性,例如某个对象的某个属性是Object、Interface、abstruct等类型,为了在反序列化时能完整恢复,需要写入具体的类型信息,这时候可以指定更多的类,在反序列化时也会自动调用具体类对象的某些方法来设置这些对象的属性值...另外,许多集合、Map等类型无法使用它们运行时表示形式进行传输/存储(例如Map,在运行时存储是通过计算了对象的hashcode等信息,但是存储是没有保存这些信息的),这意味着所有基于字段的编组器都会为某些类型捆绑定制转换器...这些转换器或其各自的目标类型通常必须调用攻击者提供的对象上的方法,例如Hessian中如果是反序列化map类型,会调用MapDeserializer处理map,期间map的put方法被调用,map的put...注意这里的几个判断,如果是Map接口类型使用HashMap,如果是SortedMap类型使用TreeMap,其他Map则会调用对应的默认构造器,本例中由于是Map接口类型使用的是HashMap。...小结 通过以上两条链可以看出,在Hessian反序列化中基本都是利用了反序列化处理Map类型,会触发调用Map.put->Map.putVal->key.hashCode/key.equals->.

1.4K30
领券