自定义类可序列化

在hadoop框架中实现自定义类可以被序列化。

package com.rpc.nefu;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.WritableComparable;

//自定义的序列化方法,只需要实现WritableComparable接口,重写一些方法即可 主要就是 readFields() write() compareTo()
public class personWritable implements WritableComparable<personWritable>{
	private Text name;
	private IntWritable age;
	private Text sex;
	public personWritable(){
		set("name",-1,"female");
	}
	public personWritable(String _name,int _age,String _sex){
		set(_name,_age,_sex);
	}
	public void set(String name,int age,String sex){
		this.name = new Text(name);
		this.age = new IntWritable(age);
		this.sex = new Text(sex);
	}
	//反序列化过程,将datainput的内容还原为hadoop对象
	@Override
	public void readFields(DataInput in) throws IOException {
		// TODO Auto-generated method stub
		name.readFields(in);
		age.readFields(in);
		sex.readFields(in);
	}
	//序列化过程
	@Override
	public void write(DataOutput out) throws IOException {
		// TODO Auto-generated method stub
		name.write(out);
		age.write(out);
		sex.write(out);
	}

	@Override
	public int compareTo(personWritable other) {
		// TODO Auto-generated method stub
		int cmp1 = name.compareTo(other.name);
		if(cmp1!=0){
			return cmp1;
		}
		int cmp2 = age.compareTo(other.age);
		if(cmp2!=0){
			return cmp2;
		}
		int cmp3 = sex.compareTo(other.sex);
		return cmp3;
	}
	//判断是否相等
	public boolean equals(Object o){
		if(o instanceof personWritable){
			personWritable pw = (personWritable) o;
			return name.equals(pw.name)&&age.equals(pw.age)&&sex.equals(pw.sex);
		}
		return false;
	}
	//哈希值
	public int hashCode(){
		return name.hashCode()*3+age.hashCode()*5+sex.hashCode()*7;
	}
	public String toString(){
		StringBuffer sb = new StringBuffer();
		sb.append("--");
		sb.append("姓名:"+name+"_");
		sb.append("年龄:"+age+"_");
		sb.append("性别:"+sex+"_");
		sb.append("--");
		return sb.toString();
	}
}
package com.rpc.nefu;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;

//import org.apache.hadoop.io.Writable;

//将序列化的对象的内容返回到一个字节数组中去 记录序列的过程
public class hadoopSerializable {
	public static byte[] serialize(personWritable writable) throws IOException{
		//创建一个字节数组
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		//创建一个DataOutputStream,将字节数组传递进去,保存输出的序列化后的内容
        DataOutputStream dataout =  new DataOutputStream(out);
        //让参数的Hadoop对象序列化到字节流中
        writable.write(dataout);
        dataout.close();
        //返回序列化后的字节流
        return out.toByteArray();
	}

		   /**
		    *这个方法用于反序列化一个字节数组成Hadoop Writable对象
		    *@param writable 反序列化后的Writable对象存放在这个参数中
		    *@param bytes 被反序列化的字节数组 对应于上面序列化的bytes
		    **/
public static void deserialize(personWritable writable,byte[] bytes) throws Exception{ 

        ByteArrayInputStream in = new ByteArrayInputStream(bytes);
        //创建一个DataInputStream
        DataInputStream datain = new DataInputStream(in);
        //让Hadoop框架反序列化这个字节数组,还原后的Writable对象存放到第一个参数中
        writable.readFields(datain); 

        datain.close();
    }
}
package com.rpc.nefu;

import org.apache.hadoop.util.StringUtils;

public class serializeTest {
	public static void main(String [] args) throws Exception{ 

        /*把我们自定义的Hadoop可序列化对象进行序列化 */
        System.out.println("Hadoop--对象序列化");
        personWritable pw = new personWritable("XD",23,"Male");
        String imformation= "自定义可序列化Hadoop类型为: "+pw.getClass().getName()+"\n";
        String primaryPersonWritableInfo = "序列化前对象为:  "+pw.toString()+"\n";
        //开始序列化过程
        byte[] serializedValue =hadoopSerializable.serialize(pw);
        String lengthInfo= "序列化后的字节数组长度为: "+serializedValue.length+"\n";
        String serializeValueInfo= "序列化后的值为: " +StringUtils.byteToHexString(serializedValue)+"\n"; 

        System.out.println(imformation+primaryPersonWritableInfo+lengthInfo+serializeValueInfo+"\n"); 

        System.out.println();
        //把我们序列化之后的字节数组反序列化为原始Hadoop对象
        System.out.println("反序列化--Hadoop");
        personWritable reversePersonWritable = new personWritable();
        /*StringUtils.byteToHexString 类似将自己数组转化为字符串*/
        String originalByteArrayInfo="被反序列化的字节数组内容为: "+StringUtils.byteToHexString(serializedValue)+"\n";
        //开始反序列化过程
        hadoopSerializable.deserialize(reversePersonWritable, serializedValue);
        String restoredValueInfo = "反序列化之后的Writable对象为: "+reversePersonWritable.toString();
        System.out.println(originalByteArrayInfo+restoredValueInfo+"\n");
    }
}

此过程在eclipse上完成,可能会存在出入。

时间: 2024-11-09 06:44:58

自定义类可序列化的相关文章

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

序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象.(摘自百度百科) 在很多通讯或者数据存储的过程中,都需要序列化和反序列化的过程. 在C#中,如果想要进行自定义类的序列化,只需要简单地在定义类的时候添加Serializable标签即可.如: 1 2 3 4 5 6 [Serializable] public class Person {

结合手机上网流量业务来说明Hadoop中的自定义数据类型(序列化、反序列化机制)

大家都知道,Hadoop中为Key的数据类型必须实现WritableComparable接口,而Value的数据类型只需要实现Writable接口即可:能做Key的一定可以做Value,能做Value的未必能做Key.但是具体应该怎么应用呢?--本篇文章将结合手机上网流量业务进行分析. 先介绍一下业务场景:统计每个用户的上行流量和,下行流量和,以及总流量和. 本次描述所用数据: 日志格式描述: 日志flowdata.txt中的具体数据: 接下来贴出详细代码,代码中含有详细注释,从代码中可以看出,

初识序列化和反序列化,使用BinaryFormatter类、ISerializable接口、XmlSerializer类进行序列化和反序列化

序列化是将对象转换成字节流的过程,反序列化是把字节流转换成对象的过程.对象一旦被序列化,就可以把对象状态保存到硬盘的某个位置,甚至还可以通过网络发送给另外一台机器上运行的进程.本篇主要包括: ● 使用BinaryFormatter类进行序列化和反序列化● 使用ISerializable接口自定义序列化过程● 使用XmlSerializer类进行序列化和反序列化 □ 使用BinaryFormatter类进行序列化和反序列化 首先把需要序列化的类打上[Serializable]特性,如果某个字段不需

Android通过Intent传输包含自定义类的ArrayList

前言 之前项目中通过Intent只是传输简单的字符串,这次因为需要在前一个页面联网获取对象数据,然后在下一个页面使用,所以考虑到使用Intent传输包含自定义类的ArrayList. Serializable Java的对象序列化指的是将那些实现了Serializable接口的对象转换成一个字节序列,并且能在需要的时候再将这个字节序列完全恢复为之前的对象. 想实现对象的序列化,需要实现java.io.Serializable接口(注意,这个接口只是一个标记接口,并没有具体需要override的方

C#中关于类的序列化

1.什么是序列化 序列化是将对象状态转换为可保持或传输的格式的过程,在序列化过程中,对象的公共字段和私有字段以及类的名称(包括包含该类的程序集)都被转换为字节流,然后写入数据流.与序列化相对的是反序列化,它将流转换为对象.这两个过程结合起来,可以轻松地存储和传输数据. 2.为什么使用序列化 一个原因是将对象的状态保持在存储媒体中,以便可以在以后重新创建精确的副本. 我们经常需要将对象的字段值保存到磁盘中,并在以后检索此数据.尽管不使用序列化也能完成这项工作,但这种方法通常很繁琐而且容易出错,并且

Serializable 指示一个类可以序列化;ICloneable支持克隆,即用与现有实例相同的值创建类的新实例(接口);ISerializable允许对象控制其自己的序列化和反序列化过程(接口)

Serializable : 序列化是指将对象实例的状态存储到存储媒体的过程.在此过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转换为字节流,然后再把字节流写入数据流.在随后对对象进行反序列化时,将创建出与原对象完全相同的副本. 在 面向对象的环境中实现序列化机制时,必须在易用性和灵活性之间进行一些权衡.只要您对此过程有足够的控制能力,就可以使该过程在很大程度上自动进行.例 如,简单的二进制序列化不能满足需要,或者,由于特定原因需要确定类中那些字段需要序列化. 基本序列化

自定义类签发校验token-实现多方式登录-自定义反爬类-admin后台表管理字段自定义-群查接口-搜索-排序-分页

目录 复习 今日 签发token 校验token 案例:实现多方式登陆签发token 案例:自定义认证反爬规则的认证类 admin使用自定义User表:新增用户密码密文 群查接口各种筛选组件数据准备 drf搜索过滤组件 drf排序过滤组件 drf基础分页组件 复习 """ 频率组件:限制接口的访问频率 源码分析:初始化方法.判断是否有权限方法.计数等待时间方法 自定义频率组件: class MyThrottle(SimpleRateThrottle): scope = 'sm

内部类,drf响应类,序列化与反序列化

内部类 # 概念:将类定义在一个类的内部,被定义的类就是内部类 # 特点:内部类及内部类的所以名称空间,可以直接被外部类访问的 # 应用:通过内部类的名称空间,给外部类额外拓展一些特殊的属性(配置),典型的Meta内部类 - 配置类 class Book(model.Model): class Meta: db_model = "owen_book" # 配置自定义表名 class BookSerializer(serializers.ModelSerializer): class M

68 drf 响应类reponse 序列化数据校验与写入

1.内部类 就是当前类的配置类 1.序列化组件的配置类 2.数据库model配置类 解释: 伪代码         继承的model类支持db_name,所以Meta类要使用db_name的写法 """ class Car(Model): name = CharFields() class Meta: db_name = "表名" # Car表,将会name作为Car表的字段 (内部可以通过Car.name访问到name) (内部可以通过Car.Meta.