序列化与反序列化

package org.yzl.j2se;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class MyTest  {
 /*****************************序列化与反序列化例子**********************************************
  */
 private ByteArrayOutputStream baos;
 private ObjectOutputStream oos;
 private ByteArrayInputStream bais;
 private ObjectInputStream ois;
 private User user;

 public MyTest() {
  // 构造实体对象
  user = new User();
  user.setId(1);
  user.setUserName("云中龙");
  user.setUserPwd("root");
  user.setAge(21);
 }
 // 序列化
 public void output() throws Exception {
  baos = new ByteArrayOutputStream();
  oos = new ObjectOutputStream(baos);
  oos.writeObject(user);
  System.out.println("ByteArrayOutputStream对象输出:"+baos);
  baos.close();
  oos.close();
 }

 // 对象进行反序列化成实体对象
 public User input() throws Exception {
  bais = new ByteArrayInputStream(baos.toByteArray());
  ois = new ObjectInputStream(bais);
  Object object = ois.readObject();
  bais.close();
  ois.close();
  return (User) object;
 }
 /***************************************************************************
  * 以UTF-8编码格式写入读出
  *
  */
 DataOutputStream dos;
 DataInputStream dis;
 // 序列化
 String str;
 public void doutput() throws Exception {
  baos = new ByteArrayOutputStream();
  dos = new DataOutputStream(baos);
  dos.writeInt(2);
  dos.writeUTF(new String("松松"));
  dos.writeUTF("root");
  dos.writeInt(user.getAge());
  str = new String(baos.toByteArray());
  /***********************************************************************
   * 注意若以UTF-8编码格式写入到ByteArrayOutputStream流对象中再将其toByteArray构造成String类型
   * 再次改成字节进行反序列化时可能会抛出java.io.UTFDataFormatException: malformed input around byte 44异常;
   * 例如字符串中加入"胡"字时抛出java.io.UTFDataFormatException:异常信息
   * 奇怪的是如果字符串为英文格式时运行正常,具体原因有待研究
   * 若直接用ByteArrayOutputStream toByteArray获取的字节数组进行反序列构造对时不会抛出异常
   */
  System.out.println("构造字符串输出:"+str);
  baos.close();
  dos.close();
 }

 // 对象进行反序列化构建新的实体对象
 public User dinput() throws Exception {
  bais = new ByteArrayInputStream(str.getBytes());
  dis = new DataInputStream(bais);
  User user = new User();
  user.setId(dis.readInt());
  user.setUserName(dis.readUTF());
  user.setUserPwd(dis.readUTF());
  user.setAge(dis.readInt());
  bais.close();
  dis.close();
  return user;
 }
 // 测试函数
 public static void main(String[] args) {
  MyTest ms = new MyTest();
  try {
   System.out.println("--------------------方法一效果------------------------");
   ms.output();
   User user = (User) ms.input();
   System.out.println("/tuserid:" + user.getId() + "/tuserName:"
     + user.getUserName() + "/tuserPwd:" + user.getUserPwd()
     + "/tuserAge:" + user.getAge()+"/n");
   System.out.println("------------------方法二效果---------------------------");
   ms.doutput();
   User user2 = ms.dinput();
   System.out.println("/tuserid:" + user2.getId() + "/tuserName:"
     + user2.getUserName() + "/tuserPwd:" + user2.getUserPwd()
     + "/tuserAge:" + user2.getAge());
  } catch (Exception e) {
   // TODO: handle exception
   e.printStackTrace();
  }
 }
}
-----------------------------------------------------------输出信息-----------------------------

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值