• 关于Java序列化和Hadoop的序列化


     1 import java.io.DataInput;
     2 import java.io.DataOutput;
     3 import java.io.DataOutputStream;
     4 import java.io.FileOutputStream;
     5 import java.io.IOException;
     6 import java.io.ObjectOutputStream;
     7 import java.io.Serializable;
     8 
     9 import org.apache.hadoop.io.Writable;
    10 
    11 public class Test2 {
    12     public static void main(String[] args) throws IOException {
    13         Student stu = new Student(1, "张三");
    14         FileOutputStream fileOutputStream = new FileOutputStream("d:/111");
    15         ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
    16         objectOutputStream.writeObject(stu);
    17         objectOutputStream.close();
    18         fileOutputStream.close();
    19         //我们一般只关注stu对象的id和name两个属性总共12个字节.但是Java的序列化到硬盘上的文件有175个字节.
    20         //Java序列化了很多没有必要的信息.如果要序列化的数据有很多,那么序列化到磁盘上的数据会更多,非常的浪费.
    21         //Hadoop没有使用Java的序列化机制.如果采用会造成集群的网络传输的时间和流量都集聚的增长.
    22         //Hadoop中自己定义了一个序列化的接口Writable.
    23         //Java序列化中之所以信息多是因为把 类之间的的继承多态信息都包含了.
    24         
    25         StuWritable stu2 = new StuWritable(1, "张三");
    26         FileOutputStream fileOutputStream2 = new FileOutputStream("d:/222");
    27         DataOutputStream dataOutputStream2 = new DataOutputStream(fileOutputStream2);
    28         stu2.write(dataOutputStream2);
    29         fileOutputStream2.close();
    30         dataOutputStream2.close();
    31     }
    32 }
    33 
    34 class Student implements Serializable{
    35     private Integer id;
    36     private String name;
    37     
    38     public Student() {
    39         super();
    40     }
    41     public Student(Integer id, String name) {
    42         super();
    43         this.id = id;
    44         this.name = name;
    45     }
    46     public Integer getId() {
    47         return id;
    48     }
    49     public void setId(Integer id) {
    50         this.id = id;
    51     }
    52     public String getName() {
    53         return name;
    54     }
    55     public void setNameString(String name) {
    56         this.name = name;
    57     }
    58     
    59 }
    60 
    61 
    62 class StuWritable  implements Writable{
    63     private Integer id;
    64     private String name;
    65     
    66     public StuWritable() {
    67         super();
    68     }
    69     public StuWritable(Integer id, String name) {
    70         super();
    71         this.id = id;
    72         this.name = name;
    73     }
    74     public Integer getId() {
    75         return id;
    76     }
    77     public void setId(Integer id) {
    78         this.id = id;
    79     }
    80     public String getName() {
    81         return name;
    82     }
    83     public void setNameString(String name) {
    84         this.name = name;
    85     }
    86 
    87     public void write(DataOutput out) throws IOException {
    88         out.writeInt(id);
    89         out.writeUTF(name);        
    90     }
    91 
    92     public void readFields(DataInput in) throws IOException {
    93         this.id = in.readInt();
    94         this.name = in.readUTF();
    95     }
    96     
    97 }

    使用Java序列化接口对应的磁盘上的文件: 共175个字节

    使用Hadoop序列化机制对应的磁盘文件: 共12字节

    如果类中有继承关系:

     1 import java.io.DataInput;
     2 import java.io.DataOutput;
     3 import java.io.DataOutputStream;
     4 import java.io.FileOutputStream;
     5 import java.io.IOException;
     6 import java.io.ObjectOutputStream;
     7 import java.io.Serializable;
     8 
     9 import org.apache.hadoop.io.Writable;
    10 
    11 public class Test2 {
    12     public static void main(String[] args) throws IOException {
    13         //我们一般只关注stu对象的id和name两个属性总共12个字节.但是Java的序列化到硬盘上的文件有175个字节.
    14         //Java序列化了很多没有必要的信息.如果要序列化的数据有很多,那么序列化到磁盘上的数据会更多,非常的浪费.
    15         //Hadoop没有使用Java的序列化机制.如果采用会造成集群的网络传输的时间和流量都集聚的增长.
    16         //Hadoop中自己定义了一个序列化的接口Writable.
    17         //Java序列化中之所以信息多是因为把 类之间的的继承多态信息都包含了.再重新构建的时候可以保持原有的关系.
    18         
    19         StuWritable stu2 = new StuWritable(1, "张三");
    20         stu2.setSex(true);
    21         FileOutputStream fileOutputStream2 = new FileOutputStream("d:/222");
    22         DataOutputStream dataOutputStream2 = new DataOutputStream(fileOutputStream2);
    23         stu2.write(dataOutputStream2);
    24         fileOutputStream2.close();
    25         dataOutputStream2.close();
    26     }
    27 }
    28 
    29 
    30 
    31 class StuWritable extends Person implements Writable{
    32     private Integer id;
    33     private String name;
    34     
    35     public StuWritable() {
    36         super();
    37     }
    38     public StuWritable(Integer id, String name) {
    39         super();
    40         this.id = id;
    41         this.name = name;
    42     }
    43     public Integer getId() {
    44         return id;
    45     }
    46     public void setId(Integer id) {
    47         this.id = id;
    48     }
    49     public String getName() {
    50         return name;
    51     }
    52     public void setNameString(String name) {
    53         this.name = name;
    54     }
    55 
    56     public void write(DataOutput out) throws IOException {
    57         out.writeInt(id);
    58         out.writeBoolean(super.isSex());
    59         out.writeUTF(name);        
    60     }
    61 
    62     public void readFields(DataInput in) throws IOException {
    63         this.id = in.readInt();
    64         super.setSex(in.readBoolean());
    65         this.name = in.readUTF();
    66     }
    67     
    68 }
    69 
    70 class Person{
    71     private boolean sex;
    72 
    73     public boolean isSex() {
    74         return sex;
    75     }
    76 
    77     public void setSex(boolean sex) {
    78         this.sex = sex;
    79     }
    80     
    81 }

    这样序列化到磁盘上的文件: 13个字节  多了一个boolean属性,相比上面多了一个字节.

     

     如果实例化对象中含有类对象.

     1 import java.io.DataInput;
     2 import java.io.DataOutput;
     3 import java.io.DataOutputStream;
     4 import java.io.FileOutputStream;
     5 import java.io.IOException;
     6 import java.io.ObjectOutputStream;
     7 import java.io.Serializable;
     8 
     9 import org.apache.hadoop.io.Writable;
    10 
    11 public class Test2 {
    12     public static void main(String[] args) throws IOException {
    13         //我们一般只关注stu对象的id和name两个属性总共12个字节.但是Java的序列化到硬盘上的文件有175个字节.
    14         //Java序列化了很多没有必要的信息.如果要序列化的数据有很多,那么序列化到磁盘上的数据会更多,非常的浪费.
    15         //Hadoop没有使用Java的序列化机制.如果采用会造成集群的网络传输的时间和流量都集聚的增长.
    16         //Hadoop中自己定义了一个序列化的接口Writable.
    17         //Java序列化中之所以信息多是因为把 类之间的的继承多态信息都包含了.再重新构建的时候可以保持原有的关系.
    18         
    19         StuWritable stu2 = new StuWritable(1, "张三");
    20         stu2.setSex(true);
    21         FileOutputStream fileOutputStream2 = new FileOutputStream("d:/222");
    22         DataOutputStream dataOutputStream2 = new DataOutputStream(fileOutputStream2);
    23         stu2.write(dataOutputStream2);
    24         fileOutputStream2.close();
    25         dataOutputStream2.close();
    26     }
    27 }
    28 
    29 class StuWritable extends Person implements Writable{
    30     private Integer id;
    31     private String name;
    32     private Student student;
    33     
    34     public StuWritable() {
    35         super();
    36     }
    37     public StuWritable(Integer id, String name) {
    38         super();
    39         this.id = id;
    40         this.name = name;
    41     }
    42     public Integer getId() {
    43         return id;
    44     }
    45     public void setId(Integer id) {
    46         this.id = id;
    47     }
    48     public String getName() {
    49         return name;
    50     }
    51     public void setNameString(String name) {
    52         this.name = name;
    53     }
    54 
    55     public void write(DataOutput out) throws IOException {
    56         out.writeInt(id);
    57         out.writeBoolean(super.isSex());
    58         out.writeUTF(name);    
    59         out.writeInt(student.getId());
    60         out.writeUTF(student.getName());
    61     }
    62 
    63     public void readFields(DataInput in) throws IOException {
    64         this.id = in.readInt();
    65         super.setSex(in.readBoolean());
    66         this.name = in.readUTF();
    67         this.student = new Student(in.readInt(),in.readUTF());
    68     }
    69     
    70 }
    71 
    72 class Person{
    73     private boolean sex;
    74 
    75     public boolean isSex() {
    76         return sex;
    77     }
    78 
    79     public void setSex(boolean sex) {
    80         this.sex = sex;
    81     }
    82     
    83 }

    如果我们Student中有个字段是Writable类型的.
    怎么样序列化?

  • 相关阅读:
    第六天学习:Python数据类型(二)
    第五天学习:python数据类型(一)
    第四天学习:运算符
    第一天学习:python的安装及helloworld
    第二十五天学习:mysql(二)
    第二十四天学习:mysql(一)
    第二十三天学习:正则(2)
    第二十二天学习:正则
    第二十一天学习:模块(三)json
    第二十天学习:模块(二)
  • 原文地址:https://www.cnblogs.com/DreamDrive/p/5476300.html
Copyright © 2020-2023  润新知