Java Mongo 自定义序列化笔记

从insert方法入手

1. org.springframework.data.mongodb.repository.support.SimpleMongoRepository.java   insert

2. org.springframework.data.mongodb.core.MongoTemplate.java    toDbObject

3. org.springframework.data.mongodb.core.convert.MappingMongoConverter.java   writeInternal

看到关键代码 :

        MongoPersistentEntity<?> entity = mappingContext.getPersistentEntity(entityType);
        writeInternal(obj, dbo, entity);
        addCustomTypeKeyIfNecessary(typeHint, obj, dbo);

第2处 writeInternal 出现:

    // Write the properties
        entity.doWithProperties(new PropertyHandler<MongoPersistentProperty>() {
            public void doWithPersistentProperty(MongoPersistentProperty prop) {

                if (prop.equals(idProperty) || !prop.isWritable()) {
                    return;
                }

                Object propertyObj = accessor.getProperty(prop);

                if (null != propertyObj) {

                    if (!conversions.isSimpleType(propertyObj.getClass())) {
                        writePropertyInternal(propertyObj, dbo, prop);
                    } else {
                        writeSimpleInternal(propertyObj, dbo, prop);
                    }
                }
            }
        });

其中:

entity = org.springframework.data.mapping.model.BasicPersistentEntity

writePropertyInternal 进入非简单属性的写入。

再调用 writeInternal 进行属性写入,可以看出是把 非简单属性当成对象进行循环写入的。

在写入 id 时, 调用:

org.springframework.data.mongodb.core.convert.QueryMapper.convertId 方法

/**
     * Converts the given raw id value into either {@link ObjectId} or {@link String}.
     *
     * @param id
     * @return
     */
    public Object convertId(Object id) {

        if (id == null) {
            return null;
        }

        if (id instanceof String) {
            return ObjectId.isValid(id.toString()) ? conversionService.convert(id, ObjectId.class) : id;
        }

        try {
            return conversionService.canConvert(id.getClass(), ObjectId.class) ? conversionService.convert(id, ObjectId.class)
                    : delegateConvertToMongoType(id, null);
        } catch (ConversionException o_O) {
            return delegateConvertToMongoType(id, null);
        }
    }

这里并没有区分具体的实体类型,也没有区分属性在根实体的深度,比较简单粗暴。

时间: 2024-10-23 22:24:23

Java Mongo 自定义序列化笔记的相关文章

java中的序列化和反序列化学习笔记

需要序列化的Person类: package cn.itcast_07; import java.io.Serializable; /* * NotSerializableException:未序列化异常 * * 类通过实现 java.io.Serializable 接口以启用其序列化功能.未实现此接口的类将无法使其任何状态序列化或反序列化. * 该接口居然没有任何方法,类似于这种没有方法的接口被称为标记接口. * * java.io.InvalidClassException: * cn.it

Java Serializable接口(序列化)理解及自定义序列化

  1 Serializable接口 (1)简单地说,就是可以将一个对象(标志对象的类型)及其状态转换为字节码,保存起来(可以保存在数据库,内存,文件等),然后可以在适当的时候再将其状态恢复(也就是反序列化).serialization 不但可以在本机做,而且可以经由网络操作.它自动屏蔽了操作系统的差异,字节顺序等.比如,在 Windows 平台生成一个对象并序列化之,然后通过网络传到一台 Unix 机器上,然后可以在这台Unix机器上正确地重构(deserialization)这个对象. 不必

【Java基础】序列化与反序列化深入分析

一.前言 复习Java基础知识点的序列化与反序列化过程,整理了如下学习笔记. 二.为什么需要序列化与反序列化 程序运行时,只要需要,对象可以一直存在,并且我们可以随时访问对象的一些状态信息,如果程序终止,那么对象是肯定不会存在的,但是有时候,我们需要再程序终止时保存对象的状态信息,之后程序再次运行时可以重新恢复到之前的状态,如,玩家玩游戏退出时,需要保存玩家的状态信息(如等级.装备等等),之后玩家再此登入时,必须要恢复这些状态信息.我们可以通过数据库手段来达到这个保存状态的目的,在Java中,我

java/android 设计模式学习笔记(一)---单例模式

前段时间公司一些同事在讨论单例模式(我是最渣的一个,都插不上嘴 T__T ),这个模式使用的频率很高,也可能是很多人最熟悉的设计模式,当然单例模式也算是最简单的设计模式之一吧,简单归简单,但是在实际使用的时候也会有一些坑. PS:对技术感兴趣的同鞋加群544645972一起交流 设计模式总目录 java/android 设计模式学习笔记目录 特点 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 单例模式的使用很广泛,比如:线程池(threadpool).缓存(cache).对

Java多线程技术学习笔记(二)

目录: 线程间的通信示例 等待唤醒机制 等待唤醒机制的优化 线程间通信经典问题:多生产者多消费者问题 多生产多消费问题的解决 JDK1.5之后的新加锁方式 多生产多消费问题的新解决办法 sleep和wait的区别 停止线程的方式 守护线程 线程的其他知识点 一.线程间的通信示例 返目录回 多个线程在处理同一资源,任务却不同. 假设有一堆货物,有一辆车把这批货物往仓库里面运,另外一辆车把前一辆车运进仓库的货物往外面运.这里货物就是同一资源,但是两辆车的任务却不同,一个是往里运,一个是往外运. 下面

Java对象的序列化和反序列化Serializable

1.什么是序列化和反序列化 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的过程. 2.什么情况下需要序列化 a)当你想把的内存中的对象保存到一个文件中或者数据库中时候: b)当你想用套接字在网络上传送对象的时候: c)当你想通过RMI传输对象的时候: 3.如何实现序列化 将需要序列化的类实现Serializable接口就可以了,Serializable接口中没有任何方法,可以理解为一个标记,即表明这

java之jvm学习笔记五(实践写自己的类装载器)

java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类装载器和安全管理器是可以被动态扩展的,或者说,他们是可以由用户自己定制的,今天我们就是动手试试,怎么做这部分的实践,当然,在阅读本篇之前,至少要阅读过笔记三. 下面我们先来动态扩展一个类装载器,当然这只是一个比较小的demo,旨在让大家有个比较形象的概念. 第一步,首先定义自己的类装载器,从Clas

Java Object 对象序列化和反序列化

Java Object 对象序列化和反序列化 @author ixenos 对象序列化是什么 1.对象序列化就是把一个对象的状态转化成一个字节流. 我们可以把这样的字节流存储为一个文件,作为对这个对象的复制(深拷贝):在一些分布式应用中,我们还可以把对象的字节流发送到网络上的其他计算机. 反序列化是把流结构的对象恢复为其原有形式 2.Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比JVM的生命周期更长.但

黑马程序员——————&gt; 自定义序列化

在一些特殊的场景下,如果一个类里包含的某些实例变量是敏感信息,例如银行账户信息,这时不希望系统将该实例变量值进行实例化:或者某个实例变量的类型是不可序列化的,因此不希望对该实例变量进行递归实例化,以避免引发异常.   通过在实例变量前面使用transient关键字修饰,可以指定java序列化时无须理会该实例变量.如下Person类与前面的Person类几乎完全一样,只是它的age使用了transient关键字修饰. 1 public class Person implements Seriali