Dubbo中Map类型默认的序列化和反序列化

Dubbo中Map类型默认的序列化和反序列化,第1张

序列化:

默认使用的hessian序列化中对Map的序列化使用com.alibaba.com.caucho.hessian.io.MapSerializer.

大致逻辑就是除了把map对象的key-value键值对序列化进去,默认还会将class也序列化进去。

反序列化:

默认使用的hessian序列化中对Map的反序列化使用com.alibaba.com.caucho.hessian.io.MapDeserializer.

大致分一下两段逻辑:

构造方法中的逻辑:class类型存在无参构造方法时,直接使用对应的构造方法,否则使用HashMap的无参构造器。

反序列化逻辑:类型为null或为Map的,直接只用HashMap。类型为SortedMap的,使用TreeMap,否则使用上一步中构造器去new一个实例。然后将键值对反序列化后put到创建的map实例中

总结:

1. 所以在返回类型中使用一些没有无参构造器的类作为成员变量或返回值时,实际创建的对象是HashMap,那么就可能会出现赋值时的类型不匹配的错误。

比如:

直接dubbo调用时,就会出现以下这种错误:

map() 会根据提供的函数对指定序列做映射。

第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。 扩展资料

map() 函数语法:

map(function, iterable, ...);

参数:

function -- 函数;

iterable -- 一个或多个序列

首先看看官方对于 flatMap 的定义:Transform the items emitted by an Observable into Observables, then flatten the emissions from those into a single Observable.

光看到这句话不好理解,我们拆开来看

这个时候 Mac 和 Win 就是两个互相独立的 Observable ,我们创建一个 PublishSubject<Student>来订阅

然后,将 Mac 加入序列

执行一下就能看到 Mac 的分数为 90,这个时候再去改变 Mac 的分数:

再执行一次可以看到,依次打印 90 - 95 -98

Mac 是序列中的事件,我们通过 flatMap 将它变成了 Observable<Int>。

然后我们再来看后半段,为了方便理解我们在两次改变 Mac 的成绩的中间 将 Win 加入进去。执行一次可以看到 一次打印 90 - 95 - 70 -98。

首先,flatMap会把它原序列中的每个事件,都变换成一个Observable。因此,再加入了 Win 之后,flatMap一共变换出了两个Observable<Int>,这就是 flatMap 定义的前半部分。

其次,当我们在把 win 加入到序列中的时候,flatMap 会把 Mac 中的事件的值和 Win 中的事件的值合并到一起,变成一个 Observable<Int>,这种把两个 Observable<Int>变成一个 Observable<Int>到过程就是 flatMap 定义中的后半段。

如果我们把上面的 flatMap 换成 map,就会看到 打印

map 返回的是原来的序列,如果要想

看到序列中事件的值,则需要使用 merge 合并成一个新序列


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11440545.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存