java源码:
import java.io.*;
public class LoginUser {
private String username;
private String passwd;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
public static void main(String[] args){
LoginUser loginUser = new LoginUser();
loginUser.setUsername("50");
loginUser.setPasswd("30");
try{
FileOutputStream fs = new FileOutputStream("foo.ser");
ObjectOutputStream os = new ObjectOutputStream(fs);
os.writeObject(loginUser);
os.close();
}catch(Exception ex){
ex.printStackTrace();
}
}
}
报错如下:
java.io.NotSerializableException: com.longshine.zwp.test.LoginUser
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1081)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:302)
at com.longshine.zwp.test.LoginUser.main(LoginUser.java:29)
类的定义改成如下:
public class LoginUser implements Serializable{
}
则可以保存下来内存中的java对象。
1、序列化是干什么的?
简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来。虽然你可以用你自己的各种各样的方法来保存object states,但是Java给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化。
2、什么情况下需要序列化
a)当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;
b)当你想用套接字在网络上传送对象的时候;
c)当你想通过RMI传输对象的时候;
3、当对一个对象实现序列化时,究竟发生了什么?
在没有序列化前,每个保存在堆(Heap)中的对象都有相应的状态(state),即实例变量(instance ariable)比如:
java 代码
-
Foo myFoo = new Foo();
-
myFoo .setWidth(37);
-
myFoo.setHeight(70);
当 通过下面的代码序列化之后,MyFoo对象中的width和Height实例变量的值(37,70)都被保存到foo.ser文件中,这样以后又可以把它 从文件中读出来,重新在堆中创建原来的对象。当然保存时候不仅仅是保存对象的实例变量的值,JVM还要保存一些小量信息,比如类的类型等以便恢复原来的对 象。
java 代码
-
FileOutputStream fs = new FileOutputStream("foo.ser");
-
ObjectOutputStream os = new ObjectOutputStream(fs);
-
os.writeObject(myFoo);
4、实现序列化(保存到一个文件)的步骤
a)Make a FileOutputStream b)Make a ObjectOutputStream
java 代码
-
FileOutputStream fs = new FileOutputStream("foo.ser");
java 代码
-
ObjectOutputStream os = new ObjectOutputStream(fs);
c)write the object
java 代码
-
os.writeObject(myObject1);
-
os.writeObject(myObject2);
-
os.writeObject(myObject3);
d) close the ObjectOutputStream
java 代码
5、举例说明
6、相关注意事项
a)序列化时,只对对象的状态进行保存,而不管对象的方法;
b)当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口;
c)当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化;
d)并非所有的对象都可以序列化,,至于为什么不可以,有很多原因了,比如:
1.安全方面的原因,比如一个对象拥有private,public等field,对于一个要传输的对象,比如写到文件,或者进行rmi传输 等等,在序列化进行传输的过程中,这个对象的private等域是不受保护的。
2. 资源分配方面的原因,比如socket,thread类,如果可以序列化,进行传输或者保存,也无法对他们进行重新的资源分 配,而且,也是没有必要这样实现。
java 代码
import java.io.*;
public class LoginUser implements Serializable{
/**
*
*/
private static final long serialVersionUID = -4382915422537471820L;
private String username;
private String passwd;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
public static void save() {
LoginUser loginUser = new LoginUser();
loginUser.setUsername("50");
loginUser.setPasswd("30");
try {
FileOutputStream fs = new FileOutputStream("loginuser.txt");
ObjectOutputStream os = new ObjectOutputStream(fs);
os.writeObject(loginUser);
os.flush();
os.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
public static void read() {
try {
FileInputStream fs = new FileInputStream("loginuser.txt");//("foo.ser");
ObjectInputStream ois = new ObjectInputStream(fs);
LoginUser loginUser = (LoginUser) ois.readObject();
System.out.println(loginUser.getUsername() + "----"
+ loginUser.getPasswd());
ois.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
public static void main(String[] args){
save();
read();
}
}
序列化、反序列化为XML文件,使用XStream来序列化,需要引入xstream-1.3.1.jar包的支持,
http://xstream.codehaus.org/download.html 处可以下载jar,然后引入到Eclipse中的build path中。
Serialize.java的代码如下:
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import com.thoughtworks.xstream.*;
public class Serialize {
public static void main(String[] args) {
Serialize ser = new Serialize();
ser.serializeToXml();
ser.deSerializeFromXml();
}
public void serializeToXml(){
Person[] myPerson = new Person[2];
myPerson[0] = new Person("Jay",24);
myPerson[1] = new Person("Tom",23);
XStream xstream = new XStream();
try {
FileOutputStream fos = new FileOutputStream("E:\\workspace\\2010_03\\src\\myPerson.xml");
xstream.toXML(myPerson,fos);
} catch (FileNotFoundException ex) {
ex.printStackTrace();
}
System.out.println(xstream.toXML(myPerson));
}
public void deSerializeFromXml(){
XStream xs = new XStream();
Person[] myPerson = null;
try {
FileInputStream fis = new FileInputStream("E:\\workspace\\2010_03\\src\\myPerson.xml");
myPerson=(Person[])xs.fromXML(fis);
if (myPerson != null)
{
int len = myPerson.length;
for (int i=0;i<len;i++)
{
System.out.println(myPerson[i].getName());
System.out.println(myPerson[i].getAge());
}
}
} catch (FileNotFoundException ex) {
ex.printStackTrace();
}
}
}
运行结果为(console输出),当然可以查看到myPerson.xml文件已经生成:
Inside Person's Constructor
Inside Person's Constructor
<Person-array>
<Person>
<name>Jay</name>
<age>24</age>
</Person>
<Person>
<name>Tom</name>
<age>23</age>
</Person>
</Person-array>
Jay
24
Tom
23
分享到:
相关推荐
【JAVA对象序列化保存为XML文件的工具类】 在Java编程中,对象序列化是一种将对象的状态转换为字节流的过程,以便可以存储或在网络上传输。而在反序列化时,这个字节流又可以恢复为原来的对象。Java提供了一个方便...
在标签中提到了"源码"和"工具",这可能意味着博客作者还深入分析了Java序列化机制的源代码,并介绍了一些辅助工具,例如`jserialcom`或`serialver`命令,用于查看类的serialVersionUID。 文件列表中的"ser"可能是...
在Java中,序列化(Serialization)是指将一个对象转换为字节流的过程,这个字节流可以保存到磁盘上,或者通过网络进行传输。要实现一个对象的序列化,该对象的类必须实现`Serializable`接口。这是一个标记接口,...
将对象状态转换成字节流之后,可以用java.io包中的各种字节流类将其保存到文件中,管道到另一线程中或通过网络连接将对象数据发送到另一主机。对象序列化功能非常简单、强大,在RMI、Socket、JMS、EJB都有应用。对象...
在Web开发中,有时我们需要将对象的信息...以上就是关于“序列化保存对象到Cookie”的详细知识。在实际开发中,合理利用Cookie可以帮助我们实现用户会话管理、个性化设置等功能,但同时也需要注意数据安全和隐私保护。
Java文件序列化是Java平台中一种重要的数据存储和交换机制,它允许我们将对象的状态转换为字节流,以便可以保存到磁盘、网络传输或在内存中存储,然后在需要时将这些字节流恢复为原来的对象。这个过程称为序列化...
- Java序列化是Java平台提供的一种持久化机制,它允许将对象转换为字节序列,这样就可以保存在文件中或在网络上传输。 - 序列化不仅可以用来持久化数据,还可以用于进程间通信(IPC)和远程方法调用(RMI)。 2. ...
### Java序列化(Serializable)的作用与反序列化详解 #### 一、序列化的概念 序列化是指将程序中的对象转换为一系列字节流的过程,主要用于保存对象的状态或在网络之间传输对象。序列化的主要目的是为了能够持久化...
1. **持久化存储**:序列化使得对象可以被保存到硬盘上,即使程序关闭,对象状态也能保持。 2. **网络传输**:序列化的对象可以被发送到网络的另一端,用于分布式系统中的对象通信。 3. **缓存**:序列化可以用于...
在Java应用程序中,序列化用于保存对象的状态以便稍后恢复,或者在网络间传输对象。然而,这个过程也可能引入安全风险,因为不安全的反序列化可能导致远程代码执行(RCE)漏洞。 在给定的标题和描述中,提到了几个...
### Java序列化(Serializable)的作用与反序列化详解 #### 一、序列化是什么? 序列化是指将程序中的对象转换为字节流的过程,从而方便存储或传输这些对象。通常,序列化用于将对象的状态(即其实例变量的值,而非...
Java序列化面试题(10题) 在 Java 中,序列化是一种用于处理对象流的机制,它可以将对象的内容进行流化,使其可以被读写和传输。下面是 10 个与 Java 序列化相关的面试题目: 1. 什么是 Java 序列化,如何实现 ...
Java序列化的核心是将对象转换为字节流,这涉及到一系列复杂的操作步骤。 ##### 序列化算法示例 为了更好地理解序列化的过程,我们可以通过一个简单的例子来进行说明。 ```java import java.io.Serializable; ...
序列化是将一个对象转换为字节流的过程,这使得我们可以将对象的状态保存到文件或数据库中,或者在网络上传输。在Java中,要使一个类能够被序列化,我们需要让该类实现`java.io.Serializable`接口。例如: ```java ...
### Java序列化与反序列化详解 #### 一、Java序列化概述 Java序列化(Serialization)是一项重要的功能,它可以将对象的状态转化为一系列字节,从而实现对象的持久化存储或在网络上传输。序列化机制使得Java对象...
Java序列化是Java平台提供的一种将对象转换为字节流,以便存储、在网络上传输或者在后续时间重新创建相同对象的机制。这是Java编程中一个非常重要的概念,尤其是在分布式环境和持久化存储中。让我们深入探讨一下Java...
把字节序列化保存到文件中,就可以做到持久化保存数据内容。 1.2 如何将对象数据序列化保存到文件 使用ObjectOutputStream完成序列化操作: Constructor: ObjectOutputStream(OutputStream out) Method: void ...
在这个特定的场景中,我们关注的是如何使用Java序列化来多次追加对象到一个TXT文件,而不是覆盖原有的内容,以及如何从TXT文件中反序列化这些对象并显示在控制台上。 首先,要实现序列化,我们的类必须实现`...
文件序列化是一种常见的序列化应用场景,用于将对象状态保存到文件中。这一过程涉及将对象写入文件,然后在需要时读回内存,恢复其状态。 #### 网络序列化 在网络环境中,对象序列化尤其重要,因为它允许对象跨...
3. 存储和恢复:在需要保存对象时,调用序列化方法将对象转换为字节流,然后写入文件;在加载时,从文件读取字节流,再调用反序列化方法恢复对象状态。 C++中实现序列化的一种常见方式是使用`std::ofstream`和`std:...