`
hy2012_campus
  • 浏览: 30588 次
  • 性别: Icon_minigender_1
  • 来自: 河南
社区版块
存档分类
最新评论

各种序列话总结

    博客分类:
  • java
 
阅读更多

 

FST实现序列化

/**
 * 使用 FST 实现序列化
 * 
 * @author winterlau
 */
public class FSTSerializer implements Serializer {

	@Override
	public String name() {
		return "fst";
	}

	@Override
	public byte[] serialize(Object obj) throws IOException {
		ByteArrayOutputStream out = null;
		FSTObjectOutput fout = null;
		try {
			out = new ByteArrayOutputStream();
			fout = new FSTObjectOutput(out);
			fout.writeObject(obj);
			return out.toByteArray();
		} finally {
			if (fout != null)
				try {
					fout.close();
				} catch (IOException e) {
				}
		}
	}

	@Override
	public Object deserialize(byte[] bytes) throws IOException {
		if (bytes == null || bytes.length == 0)
			return null;
		FSTObjectInput in = null;
		try {
			in = new FSTObjectInput(new ByteArrayInputStream(bytes));
			return in.readObject();
		} catch (ClassNotFoundException e) {
			throw new CacheException(e);
		} finally {
			if (in != null)
				try {
					in.close();
				} catch (IOException e) {
				}
		}
	}

}

 原生的java序列话

/**
 * 标准的 Java 序列化
 * 
 * @author winterlau
 */
public class JavaSerializer implements Serializer {

	@Override
	public String name() {
		return "java";
	}

	@Override
	public byte[] serialize(Object obj) throws IOException {
		ObjectOutputStream oos = null;
		try {
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			oos = new ObjectOutputStream(baos);
			oos.writeObject(obj);
			return baos.toByteArray();
		} finally {
			if (oos != null)
				try {
					oos.close();
				} catch (IOException e) {
				}
		}
	}

	@Override
	public Object deserialize(byte[] bits) throws IOException {
		if (bits == null || bits.length == 0)
			return null;
		ObjectInputStream ois = null;
		try {
			ByteArrayInputStream bais = new ByteArrayInputStream(bits);
			ois = new ObjectInputStream(bais);
			return ois.readObject();
		} catch (ClassNotFoundException e) {
			throw new CacheException(e);
		} finally {
			if (ois != null)
				try {
					ois.close();
				} catch (IOException e) {
				}
		}
	}

}

 kryo序列话方式:

/**
 * Created by chenlei on 14-9-28.
 */
public class KryoPoolSerializer implements Serializer{

    /**
     * Kryo 的包装
     */
    private static class KryoHolder {
        private Kryo kryo;
        static final int BUFFER_SIZE = 1024;
        private Output output = new Output(BUFFER_SIZE, -1);     //reuse
        private Input input = new Input();

        KryoHolder(Kryo kryo) {
            this.kryo = kryo;
        }

    }


    interface KryoPool {

        /**
         * get o kryo object
         * @return KryoHolder instance
         */
        KryoHolder get();

        /**
         * return object
         * @param kryo holder
         */
        void offer(KryoHolder kryo);
    }



    /**
     * 由于kryo创建的代价相对较高 ,这里使用空间换时间
     * 对KryoHolder对象进行重用
     */
    public static class KryoPoolImpl implements KryoPool {
        /**
         * default is 1500
         * online server limit 3K
         */

        /**
         * thread safe list
         */
        private final Deque<KryoHolder> kryoHolderDeque=new ConcurrentLinkedDeque<KryoHolder>();

        private KryoPoolImpl() {

        }

        /**
         * @return KryoPool instance
         */
        public static KryoPool getInstance() {
            return Singleton.pool;
        }

        /**
         * get o KryoHolder object
         *
         * @return KryoHolder instance
         */
        @Override
        public KryoHolder get() {
            KryoHolder kryoHolder = kryoHolderDeque.pollFirst();       // Retrieves and removes the head of the queue represented by this table
            return kryoHolder == null ? creatInstnce() : kryoHolder;
        }

        /**
         * create a new kryo object to application use
         * @return KryoHolder instance
         */
        public KryoHolder creatInstnce() {
            Kryo kryo = new Kryo();
            kryo.setReferences(false);//
            return new KryoHolder(kryo);
        }

        /**
         * return object
         * Inserts the specified element at the tail of this queue.
         *
         * @param kryoHolder ...
         */
        @Override
        public void offer(KryoHolder kryoHolder) {
            kryoHolderDeque.addLast(kryoHolder);
        }

        /**
         * creat a Singleton
         */
        private static class Singleton {
            private static final KryoPool pool = new KryoPoolImpl();
        }
    }

    @Override
    public String name() {
        return "kryo_pool_ser";
    }

    /**
     * Serialize object
     * @param obj what to serialize
     * @return return serialize data
     */
    @Override
    public byte[] serialize(Object obj) throws IOException {
        KryoHolder kryoHolder = null;
        if (obj == null) throw new CacheException("obj can not be null");
        try {
            kryoHolder = KryoPoolImpl.getInstance().get();
            kryoHolder.output.clear();  //clear Output    -->每次调用的时候  重置
            kryoHolder.kryo.writeClassAndObject(kryoHolder.output, obj);
            return kryoHolder.output.toBytes();// 无法避免拷贝  ~~~
        } catch (CacheException e) {
            throw new CacheException("Serialize obj exception");
        } finally {
            KryoPoolImpl.getInstance().offer(kryoHolder);
            obj = null; //GC
        }
    }

    /**
     * Deserialize data
     * @param bytes what to deserialize
     * @return object
     */
    @Override
    public Object deserialize(byte[] bytes) throws IOException {
        KryoHolder kryoHolder = null;
        if (bytes == null) throw new CacheException("bytes can not be null");
        try {
            kryoHolder = KryoPoolImpl.getInstance().get();
            kryoHolder.input.setBuffer(bytes, 0, bytes.length);//call it ,and then use input object  ,discard any array
            return kryoHolder.kryo.readClassAndObject(kryoHolder.input);
        } catch (CacheException e) {
            throw new CacheException("Deserialize bytes exception");
        } finally {
            KryoPoolImpl.getInstance().offer(kryoHolder);
            bytes = null;       //  for gc
        }
    }
}

 

/**
 * 使用 Kryo 实现序列化
 * @author winterlau
 */
public class KryoSerializer implements Serializer {

	private final static Kryo kryo = new Kryo();


    @Override
	public String name() {
		return "kryo";
	}

	@Override
	public byte[] serialize(Object obj) throws IOException {
		Output output = null;
		try {
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			output = new Output(baos);
			kryo.writeClassAndObject(output, obj);
			output.flush();
			return baos.toByteArray();
		}finally{
			if(output != null)
				output.close();
		}
	}

	@Override
	public Object deserialize(byte[] bits) throws IOException {
		if(bits == null || bits.length == 0)
			return null;
		Input ois = null;
		try {
			ByteArrayInputStream bais = new ByteArrayInputStream(bits);
			ois = new Input(bais);
			return kryo.readClassAndObject(ois);
		} finally {
			if(ois != null)
				ois.close();
		}
	}
	
}

 

分享到:
评论

相关推荐

    最长公共子序列算法总结

    ### 最长公共子序列算法总结 #### 一、O(n^2)算法 在讨论最长公共子序列(Longest Common Subsequence,简称LCS)问题时,通常会提及两种主要的算法实现方式:一种时间复杂度为O(n^2),另一种则通过优化达到O...

    C语言序列点总结

    C语言序列点总结 序列点是C语言中的一个重要概念,它指的是程序运行中的一个特殊时间点,在该点之前的所有副作用已经结束,并且后续的副作用还没发生,而两个序列点之间所有的表达式或代码执行顺序是未定义的。 副...

    机器学习 时间序列预测总结版本

    机器学习时间序列预测总结版本 在机器学习领域中,时间序列预测是一个非常重要的主题。时间序列预测是指通过分析过去的数据,来预测未来某个时间点的值。这种技术广泛应用于金融、经济、气象、交通等领域。在这篇...

    C# 各种序列化和反序列化

    本篇文章将深入探讨C#中的各种序列化方式,包括XML、SOAP、JSON和二进制序列化。 首先,我们来看XML序列化。XML(eXtensible Markup Language)是一种结构化的数据格式,易于阅读和解析,且具有良好的跨平台兼容性...

    JSon发序列化总结

    ### JSON序列化与反序列化的C#实现 #### 概述 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它易于人阅读和编写,同时也易于机器解析和生成。JSON是基于纯文本的格式,并且是完全独立于语言的。...

    时间序列分析总结XXXX06.pptx

    时间序列分析总结XXXX06.pptx

    扩频通信实验报告(m序列、Kasami序列小集,Gold序列)

    总结来说,这个实验报告深入探讨了扩频通信中的基本元素——m序列、Kasami序列和Gold序列的生成方法和特性。通过这些伪随机序列,我们可以更好地理解扩频通信的工作原理,以及如何利用它们提高通信系统的效率和可靠...

    C#编程总结(一)序列化总结

    在C#中,序列化主要分为三种类型:二进制序列化、XML序列化和数据契约序列化。 1. **二进制序列化**: 二进制序列化是将对象的完整状态,包括私有字段和类型信息,转换为字节流,适合在应用程序的不同调用之间保留...

    序列等待事件总结

    【序列等待事件总结】 在Oracle数据库中,等待事件是用于诊断性能问题的关键工具,它们记录了数据库实例在等待什么资源才能继续执行。本篇博客主要聚焦于四种特定的序列等待事件:enq SQ - contention、row cache ...

    m序列产生及特性实验

    m序列(最大长度序列)是数字通信领域中一种重要的伪随机码,它是由n级线性反馈移位寄存器(LFSR)生成的周期为2^n-1的序列。这种序列具有类似随机序列的统计特性,但在确定的反馈逻辑下完全确定且周期性重复。在码...

    C++ JSON 序列化与反序列化

    **四、总结** C++的JSON序列化和反序列化是开发Web服务、网络通信或存储配置文件时必不可少的技术。选择合适的库并理解其工作原理,能帮助我们更高效地处理JSON数据。通过实践和学习,可以掌握更多高级技巧,如...

    ZEMAX中如何将序列透镜转为非序列组件

    在ZEMAX中将序列透镜转为非序列组件是一项高级技巧,能够帮助设计师更好地应对各种复杂光学系统的设计挑战。通过上述步骤,可以有效地将现有的序列透镜系统转换为非序列模式下更加灵活的组件,从而实现更精细的设计...

    1. 科普特序列和格雷码序列_格雷差分序列_科普特序列和格雷码序列_

    总结一下,科普特序列和格雷码序列都是在信息技术领域中广泛使用的特殊序列。科普特序列因其伪随机性而在测试和仿真中得到应用,而格雷码序列则因其在减少传输错误方面的优势而在编码和通信中发挥作用。MATLAB作为...

    java 对象的序列化与反序列化

    Java对象的序列化和反序列化是Java编程中一项...总结,Java对象的序列化和反序列化是Java编程中的基础概念,它涉及到数据持久化、网络通信等多个方面。理解并熟练运用这一技术,能够帮助开发者更有效地管理和传递数据。

    C#和Java的序列化反序列化

    总结来说,C#和Java的序列化和反序列化机制都是各自语言中不可或缺的一部分,它们使得数据能够在不同环境之间自由流动。理解和掌握这些技术对于任何软件开发者来说都是非常重要的,特别是涉及到数据持久化、网络通信...

    序列化和反序列化的封装类

    总结来说,序列化和反序列化是将对象转换为可存储或传输的格式的过程,而封装类的使用则可以简化这些操作,使得开发者可以更加专注于业务逻辑而不是底层的序列化细节。在C#中,我们可以利用.NET框架提供的工具来实现...

    基于boost的序列化与反序列化

    总结来说,Boost.Serialization是C++开发中一个强大且灵活的工具,它简化了对象的序列化和反序列化过程,支持多种序列化格式和流类型,使得数据的持久化和跨进程传输变得简单易行。通过熟练掌握Boost.Serialization...

    hessian学习基础篇——序列化和反序列化

    通过阅读和分析Hessian的源码,我们可以了解其如何编码和解码各种数据类型,以及如何优化序列化和反序列化的过程。这对于优化自定义序列化逻辑或者解决Hessian使用中遇到的问题非常有帮助。 总结起来,Hessian是一...

    memcached各种序列化策略之session共享

    标题提到的"memcached各种序列化策略之session共享",意味着本文将探讨如何在Memcached中使用不同的序列化方法来共享Web应用中的session数据。Memcached是一个高性能、分布式内存对象缓存系统,常用于减轻数据库负载...

    最长公共子序列实验报告

    最长公共子序列(Longest Common Subsequence,LCS)是一个经典的计算机科学问题,涉及序列比较和算法设计。在本实验报告中,我们将深入探讨如何利用动态规划方法解决这一问题。 首先,LCS问题旨在找到两个给定序列...

Global site tag (gtag.js) - Google Analytics