`
OracleX
  • 浏览: 123794 次
  • 性别: Icon_minigender_1
  • 来自: 地球
社区版块
存档分类
最新评论

用序列化(Serializable)保存、读取对象

阅读更多

   实现Serializable借口的对象可以被转换成一系列字节,并可以在以后使用时完全恢复原来的样子。这一过程也可以在网络中进行,这样就可以先在windows机器上创建一个对象,对其序列化,然后通过网络发送给Linux机器,就可以在Linux机器上准确无误地恢复成原来的样子。整个过程不必关心数据在不同机器上如何表示,也不必关心字节的顺序或其他细节。

      序列化的思想就是“冻结”对象,操作对象(写到磁盘,通过网络传输等),然后“解冻”对象,重新获得可用的Java对象。功能的实现要靠ObjectInputStream/ObjectOutputStream类,完全保真原数据,并且开发愿意用Serializable。

     实现了Serializable接口的类为保证serialVersionUID 值跨不同 java 编译器实现的一致性,序列化类必须声明一个明确的 serialVersionUID 值。

     ClassA.java

public class ClassA implements Serializable {

	private static final long serialVersionUID = 6013572251564847381L;
	private String name = "My name is a";
	private ClassB b = null;

	ClassA() {
		b = new ClassB();
	}

	public String show() {

		System.out.println("a.toString <a.name=\"" + this.name
				+ "\" a.b.name=\"" + this.b.getName() + "\">");

		return "a.toString <a.name=" + this.name + " a.b.name="
				+ this.b.getName() + ">";
		// \" 双引号
		// \' 单引号
		// \\ 反斜线
	}

                 .......................
}

    ClassB.java

public class ClassB implements Serializable{

	private static final long serialVersionUID = -4324044767844361076L;

	private String name="My name is b";
	
	ClassB(){}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
	
}

将对象内容保存到文本中

WriteSeri.java

public class WriteSeri {

	public static void main(String args[]){
		ObjectOutputStream outObj=null;
		try {
			//将对象内容写入到文本中
			FileOutputStream  outStr=new FileOutputStream("obj.txt");
			outObj=new ObjectOutputStream(outStr);
			ClassA a=new ClassA();
			outObj.writeObject(a);
			System.out.println("write obj:"+a.show());
			outObj.flush();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
				try {
				if (outObj != null) {
					outObj.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

输出结果:

a.toString <a.name="My name is a" a.b.name="My name is b">
write obj:a.toString <a.name=My name is a a.b.name=My name is b>

将文本内容还原给对象

ReadSeri.java

public class ReadSeri {

	public static void main(String args[]) {
		ObjectInputStream inObj = null;
		try {
			FileInputStream inStr = new FileInputStream("obj.txt");
			inObj = new ObjectInputStream(inStr);
			ClassA a = (ClassA) inObj.readObject();
			System.out.println("read object:" + a.show());
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} finally {
			if (inObj != null) {
				try {
					inObj.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

输出结果:

a.toString <a.name="My name is a" a.b.name="My name is b">
read object:a.toString <a.name=My name is a a.b.name=My name is b>

 

 

 

 

分享到:
评论

相关推荐

    java序列化(Serializable)的作用和反序列化.doc

    序列化是指将程序中的对象转换为一系列字节流的过程,主要用于保存对象的状态或在网络之间传输对象。序列化的主要目的是为了能够持久化保存对象的状态以及在不同系统间传输这些对象。 在Java中,通过实现`...

    java serializable 序列化与反序列化

    2. **如何实现反序列化**:使用`ObjectInputStream`的`readObject()`方法从流中读取对象: ```java try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("myfile.ser"))) { MyObject obj = ...

    java对象序列化 传输 保存

    序列化不仅可以用于保存对象的状态,也可以在分布式环境中作为数据交换的手段。 在Java中,实现序列化需要让类实现`java.io.Serializable`接口。虽然这个接口没有定义任何方法,但是它的存在标记了该类的对象是可...

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

    要实现一个对象的序列化,该对象的类必须实现`Serializable`接口。这是一个标记接口,没有包含任何方法,只是表明该类的对象是可以被序列化的。 下面是一些关于序列化的重要知识点: 1. **序列化标识符...

    C++ 对象序列化 保存对象.docx

    3. 存储和恢复:在需要保存对象时,调用序列化方法将对象转换为字节流,然后写入文件;在加载时,从文件读取字节流,再调用反序列化方法恢复对象状态。 C++中实现序列化的一种常见方式是使用`std::ofstream`和`std:...

    序列化类的作用Serializable

    需要注意的是,实现序列化的类应该谨慎处理其内部状态,因为序列化会保存对象的所有字段,包括私有(private)和受保护的(protected)成员。如果某个类的父类没有实现`Serializable`接口,那么子类仍然可以序列化,...

    java序列化(Serializable)的作用和反序列化.pdf

    Java序列化是Java平台提供的一种持久化机制,它允许将对象的状态转换为字节流,以便存储到磁盘、数据库中或通过...不过,需要注意的是,序列化可能带来安全风险,如反序列化攻击,因此在设计和使用序列化时需谨慎处理。

    Serializable序列化

    总结来说,`Serializable`序列化是Java中一个基础但至关重要的特性,它使得对象状态的保存和传输成为可能。理解并熟练掌握序列化,可以帮助开发者更好地应对各种存储和通信需求。在实际应用中,要注意安全性、性能和...

    C#对象三种形式的序列化和反序列化

    - 对于反序列化,读取流并使用`Deserialize`方法恢复对象。 在处理包含图片的数据时,需要注意的是,图片通常不能直接作为字段存储在类中,而是需要转换为字节数组或Base64字符串。在序列化时,这些数据需要特殊...

    Serializable在C#中的作用.NET 中的对象序列化

    ### C#中Serializable的作用与对象序列化详解 #### 一、引言 在现代软件开发中,特别是基于.NET框架的应用程序开发中,对象序列化是一项非常重要的技术。它允许将对象的状态转换为一种持久的形式(如文件或网络传输...

    Java序列化(Serializable)与反序列化__1.docx

    1. 保存对象的状态:当需要将内存中的对象保存到文件或数据库中,以便后续恢复使用。 2. 网络传输:在网络通信中,可以通过序列化将对象转换为字节流,然后通过Socket进行传输。 3. RMI(Remote Method Invocation)...

    JAVA对象序列化保存为XML文件的工具类

    【JAVA对象序列化保存为XML文件的工具类】 在Java编程中,对象序列化是一种将对象的状态转换为字节流的过程,以便可以存储或在网络上传输。而在反序列化时,这个字节流又可以恢复为原来的对象。Java提供了一个方便...

    java对象序列化和反序列化

    - 反序列化:使用`java.io.ObjectInputStream`的`readObject()`方法从输入流读取对象。 4. **优点**: - 数据持久化:将对象的状态保存到磁盘,下次可以恢复。 - 网络传输:将对象转换为字节流,方便在网络间传递...

    Java对象序列化标准最新版

    通过实现`Externalizable`接口,可以在该方法中指定如何保存对象的状态。 **2.5 `writeReplace`方法** `writeReplace`方法允许开发者替换即将被序列化的对象。这在需要改变对象的引用或修改其状态时非常有用。 **...

    java.io.Serializable序列化问题

    使用 `Externalizable` 接口的主要优点在于可以更精确地控制序列化和反序列化过程,这对于需要自定义序列化逻辑的对象非常有用。 #### 六、序列化中的注意事项 - **`transient` 关键字**:使用 `transient` 可以...

    反序列化作用

    序列化主要的目的是为了保存对象状态,便于对象在需要的时候可以重建,比如存储到文件中或通过网络传输。反序列化则是序列化的逆过程,用来恢复对象状态。 序列化通常在以下几种情况下被需要: 1. 当你想把内存中...

    JAVA对象的序列化与反序列化详细PPT课件.pptx

    为了使一个Java对象能够被序列化,该对象所属的类必须实现`java.io.Serializable`接口。大部分JDK内置类如String和Date都已经实现了这个接口。另外,还有`java.io.Externalizable`接口,它继承自`Serializable`,但...

    java序列化对象的存储和读取共6页.pdf.zip

    序列化是将对象转换为字节序列的过程,这个字节序列可以被保存到磁盘、发送到网络或者通过其他方式保存和传递。序列化的目的是为了能够恢复对象,即使在不同的时间或不同的环境中也能做到这一点。 2. **为什么要...

Global site tag (gtag.js) - Google Analytics