`
vyloy
  • 浏览: 81256 次
  • 性别: Icon_minigender_1
  • 来自: 佛山
社区版块
存档分类
最新评论

让kryo支持反序列化没有无参构造方法的类

阅读更多
动态得到类的实例,我们通常通过反射来得到。但有时候,类缺少默认构造方法,我们又不想传参来实例化,这时候怎么办呢?
我们还可以通过sun.reflect.ReflectionFactory来完成,例子如下:

import java.lang.reflect.Constructor;
import java.util.concurrent.ConcurrentHashMap;

import sun.reflect.ReflectionFactory;

import com.esotericsoftware.kryo.Kryo;

public class Kryox extends Kryo {

	private final ReflectionFactory REFLECTION_FACTORY = ReflectionFactory
			.getReflectionFactory();

	private final ConcurrentHashMap<Class<?>, Constructor<?>> _constructors = new ConcurrentHashMap<Class<?>, Constructor<?>>();

	@Override
	public <T> T newInstance(Class<T> type) {
		try {
			return super.newInstance(type);
		} catch (Exception e) {
			return (T) newInstanceFromReflectionFactory(type);
		}
	}

	private Object newInstanceFrom(Constructor<?> constructor) {
		try {
			return constructor.newInstance();
		} catch (final Exception e) {
			throw new RuntimeException(e);
		}
	}

	@SuppressWarnings("unchecked")
	public <T> T newInstanceFromReflectionFactory(Class<T> type) {
		Constructor<?> constructor = _constructors.get(type);
		if (constructor == null) {
			constructor = newConstructorForSerialization(type);
			Constructor<?> saved = _constructors.putIfAbsent(type, constructor);
			if(saved!=null)
				constructor=saved;
		}
		return (T) newInstanceFrom(constructor);
	}

	private <T> Constructor<?> newConstructorForSerialization(
			Class<T> type) {
		try {
			Constructor<?> constructor = REFLECTION_FACTORY
					.newConstructorForSerialization(type,
							Object.class.getDeclaredConstructor());
			constructor.setAccessible(true);
			return constructor;
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

}
分享到:
评论

相关推荐

    netty传输kryo序列化的对象基于socket传输

    本主题“netty传输kryo序列化的对象基于socket传输”探讨的是如何结合Netty和Kryo,实现高效、可靠的网络数据传输。首先,我们需要了解Kryo序列化的基本原理。Kryo通过跟踪对象引用和存储类型信息来优化序列化过程,...

    【SparkCore篇04】RDD函数传递和依赖关系1

    需要注意的是,虽然Kryo序列化速度更快,但它可能不支持所有Java类的序列化,因此在使用时需要注册自定义类或确保类具有无参构造函数。此外,Kryo序列化默认是非安全的,可能会导致内存泄漏,可以通过配置`spark....

    tomcat7 通过memcache 实现 session共享依赖包

    7. **msm-kryo-serializer-2.0.0.jar**:这是Memcached Session Manager的Kryo序列化模块,专门用于将session对象序列化为Kryo格式。 8. **reflectasm-1.11.3.jar**:ReflectASM是一个优化的反射库,它提供了一种更...

    Serialization:Java中的序列化

    此外,还可以使用第三方库如Kryo或FST,它们提供了更高效的序列化和反序列化实现。 总之,Java序列化是开发中常用的一种技术,它提供了将对象持久化和在网络间传输的能力。理解和掌握序列化原理及其实现方式,对于...

    详解java中的深拷贝和浅拷贝(clone()方法的重写、使用序列化实现真正的深拷贝)

    通常,序列化和反序列化的过程比直接调用`clone()`方法更耗时,但可以确保得到真正的深拷贝。 总结: 理解深拷贝和浅拷贝的概念对于编写健壮的Java代码至关重要。浅拷贝适用于不需要复制可变字段的情况,而深拷贝则...

    java中把对象转化为byte数组的方法.doc

    4. **性能优化**:对于频繁进行序列化和反序列化的场景,可以考虑使用更高效的序列化框架,如`Kryo`、`FST`等。 #### 五、总结 通过上述介绍,我们可以了解到Java中对象与byte数组之间的相互转换是实现对象序列化...

    nginx+tomcat7+memcached所需jar

    4. `objenesis-2.1.jar`:Objenesis是一个Java库,用于在没有构造函数的情况下创建对象,这在某些序列化和反序列化场景中可能是必需的。 5. `msm-kryo-serializer-1.9.5.jar`:这是Memcached Session Manager的一个...

    msm_libs.zip

    在处理Kryo序列化过程中,ASM库可能用于生成或修改字节码,优化序列化和反序列化的效率。 5. `reflectasm-1.11.4-2.jar`:ReflectASM是一个基于反射的轻量级库,提供更快的访问Java类字段和方法的能力。在处理会话...

    hadoop自定义类型编程

    根据之前`write()`方法中的顺序,读取相应字节并反序列化到各个字段。 三、自定义WritableComparable接口 如果自定义类型还需要作为排序的键(Key),则应实现`org.apache.hadoop.io.WritableComparable&lt;T&gt;`接口。...

Global site tag (gtag.js) - Google Analytics