- 浏览: 597276 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (154)
- java (31)
- Struts (3)
- Hibernate (8)
- Spring (6)
- JS (14)
- DWR (1)
- Oracle (1)
- SQL Server (0)
- JSF (0)
- JPA (0)
- Grails (3)
- Ajax (1)
- Extjs (0)
- jQuery (4)
- MySQL (2)
- 正则表达式 (2)
- 其他 (6)
- 计算机应用 (7)
- Groovy (8)
- Google (1)
- Web (2)
- MongoDB Java Driver (1)
- mongodb (1)
- Linux (3)
- HTML (1)
- Tomcat (3)
- Eclipse (2)
- JSP (1)
- 缓存 (1)
- 动态 (1)
- 问题与解决 (3)
- HY (1)
- Android (35)
- LBS (1)
最新评论
-
u012136165:
list 方法:纠正:[2,5].add(1,9) ...
Groovy的list和map -
bruce.yuan:
误人子弟的文章。已经看到N个人转了这个帖子,这要贻害多少新人啊 ...
理解并解决GBK转UTF-8奇数中文乱码 -
思念-悲伤:
特意登录上来,感谢下!
理解String的compareTo()方法返回值 -
bo_hai:
总结的好,有效。
理解String的compareTo()方法返回值 -
u012678420:
在onCreate方法中获取某个View的宽度和高度
概述:当一个类实现了Serializable接口(该接口仅为标记接口,不包含任何方法定义),表示该类可以序列化.序列化的目的是将一个实现了Serializable接口的对象转换成一个字节序列,可以。
把该字节序列保存起来(例如:保存在一个文件里),以后可以随时将该字节序列恢复为原来的对象。甚至可以将该字节序列放到其他计算机上或者通过网络传输到其他计算机上恢复,只要该计
算机平台存在相应的类就可以正常恢复为原来的对象。
实现:要序列化一个对象,先要创建某些OutputStream对象,然后将其封装在一个ObjectOutputStream对象内,再调用writeObject()方法即可序列化一个对象;反序列化也类似。
import java.io.*;
public class Person implements Serializable {
private String userName;
private String password;
public Person(String userName, String password) {
this.userName = userName;
this.password = password;
}
public String toString() {
return "userName:" + userName + " password:" + password;
}
public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
//序列化一个对象(存储到一个文件)
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.out"));
oos.writeObject("Save a object:\n");
oos.writeObject(new Person("Bruce", "123456"));
oos.close();
//反序列化,将该对象恢复(存储到一个文件)
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.out"));
String s = (String)ois.readObject();
Person p = (Person)ois.readObject();
System.out.println(s + p);
//序列化一个对象(存储到字节数组)
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos2 = new ObjectOutputStream(baos);
oos2.writeObject("Save another object:\n");
oos2.writeObject(new Person("Phil", "654321"));
oos2.close();
//反序列化,将该对象恢复(存储到字节数组)
ObjectInputStream ois2 = new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray()));
s = (String)ois2.readObject();
p = (Person)ois2.readObject();
System.out.println(s + p);
}
}
//输入如下信息
Save a object:
userName:Bruce password:123456
Save another object:
userName:Phil password:654321
transient关键字:
自动序列化将对象的所有字段都持久化了,有时候需要对某些字段不进行自动化(如密码,因为序列化会暴光密码信息),这个时候可以使用transient关键字(只能和Serializable对象一起使
用),其作用是不序列化某些字段。将Person类的字段改为如下定义,再运行上面的程序:
private String userName;
private transient String password;
//输入如下信息
Save a object:
userName:Bruce password:null
Save another object:
userName:Phil password:null
控制序列化字段,甚至该字段是被transient修饰的字段也能将其序列化。手动序列化需要添加两个私有(private)方法(writeObject()和readObject()),在该私有方法中控制序列花字段。
import java.io.*;
public class Person implements Serializable {
private String userName;
private transient String password;
public Person(String userName, String password) {
this.userName = userName;
this.password = password;
}
public String toString() {
return "userName:" + userName + " password:" + password;
}
private void writeObject(ObjectOutputStream out) throws IOException {
out.defaultWriteObject(); //序列化所有非transient字段,必须是该方法的第一个操作
out.writeObject(password); //序列化transient字段
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject(); //反序列化所有非transient字段,必须是该方法的第一个操作
password = (String)in.readObject(); //反序列化transient字段
}
public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
//序列化一个对象(存储到一个文件)
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.out"));
oos.writeObject("Save a object:\n");
oos.writeObject(new Person("Bruce", "123456"));
oos.close();
//反序列化,将该对象恢复(存储到一个文件)
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.out"));
String s = (String)ois.readObject();
Person p = (Person)ois.readObject();
System.out.println(s + p);
}
}
//输入如下信息
Save a object:
userName:David password:13579
控制序列化字段还可以使用Externalizable接口替代Serializable借口。此时需要定义一个默认构造器,否则将为得到一个异常(java.io.InvalidClassException: Person; Person; no
valid constructor);还需要定义两个方法(writeExternal()和readExternal())来控制要序列化的字段。
import java.io.*;
public class Person implements Externalizable {
private String userName;
private String password;
public Person() {
System.out.println("default constructor invoked!");
}
public Person(String userName, String password) {
this.userName = userName;
this.password = password;
}
public String toString() {
return "userName:" + userName + " password:" + password;
}
public void writeExternal(ObjectOutput out) throws IOException {
//序列化字段
out.writeObject(userName);
out.writeObject(password);
}
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
//反序列化字段
userName = (String)in.readObject();
password = (String)in.readObject();
}
public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
//序列化一个对象(存储到一个文件)
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.out"));
oos.writeObject("Save a object:\n");
oos.writeObject(new Person("Leo", "1984"));
oos.close();
//反序列化,将该对象恢复(存储到一个文件)
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.out"));
String s = (String)ois.readObject();
Person p = (Person)ois.readObject();
System.out.println(s + p);
}
}
//输入如下信息
default constructor invoked!
Save a object:
userName:Leo password:1984
以上方式只能恢复成Java对象,如果想要恢复成其他对象(如C++对象),那就要将Java对象转换为XML格式,这样可以使其被各种平台和各种语言使用。可以使用随JDK一起发布的javax.xam.*类库,或者使用开源XOM类库(可以从www.xom.nu下载并获得文档)。
把该字节序列保存起来(例如:保存在一个文件里),以后可以随时将该字节序列恢复为原来的对象。甚至可以将该字节序列放到其他计算机上或者通过网络传输到其他计算机上恢复,只要该计
算机平台存在相应的类就可以正常恢复为原来的对象。
实现:要序列化一个对象,先要创建某些OutputStream对象,然后将其封装在一个ObjectOutputStream对象内,再调用writeObject()方法即可序列化一个对象;反序列化也类似。
import java.io.*;
public class Person implements Serializable {
private String userName;
private String password;
public Person(String userName, String password) {
this.userName = userName;
this.password = password;
}
public String toString() {
return "userName:" + userName + " password:" + password;
}
public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
//序列化一个对象(存储到一个文件)
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.out"));
oos.writeObject("Save a object:\n");
oos.writeObject(new Person("Bruce", "123456"));
oos.close();
//反序列化,将该对象恢复(存储到一个文件)
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.out"));
String s = (String)ois.readObject();
Person p = (Person)ois.readObject();
System.out.println(s + p);
//序列化一个对象(存储到字节数组)
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos2 = new ObjectOutputStream(baos);
oos2.writeObject("Save another object:\n");
oos2.writeObject(new Person("Phil", "654321"));
oos2.close();
//反序列化,将该对象恢复(存储到字节数组)
ObjectInputStream ois2 = new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray()));
s = (String)ois2.readObject();
p = (Person)ois2.readObject();
System.out.println(s + p);
}
}
//输入如下信息
Save a object:
userName:Bruce password:123456
Save another object:
userName:Phil password:654321
transient关键字:
自动序列化将对象的所有字段都持久化了,有时候需要对某些字段不进行自动化(如密码,因为序列化会暴光密码信息),这个时候可以使用transient关键字(只能和Serializable对象一起使
用),其作用是不序列化某些字段。将Person类的字段改为如下定义,再运行上面的程序:
private String userName;
private transient String password;
//输入如下信息
Save a object:
userName:Bruce password:null
Save another object:
userName:Phil password:null
控制序列化字段,甚至该字段是被transient修饰的字段也能将其序列化。手动序列化需要添加两个私有(private)方法(writeObject()和readObject()),在该私有方法中控制序列花字段。
import java.io.*;
public class Person implements Serializable {
private String userName;
private transient String password;
public Person(String userName, String password) {
this.userName = userName;
this.password = password;
}
public String toString() {
return "userName:" + userName + " password:" + password;
}
private void writeObject(ObjectOutputStream out) throws IOException {
out.defaultWriteObject(); //序列化所有非transient字段,必须是该方法的第一个操作
out.writeObject(password); //序列化transient字段
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject(); //反序列化所有非transient字段,必须是该方法的第一个操作
password = (String)in.readObject(); //反序列化transient字段
}
public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
//序列化一个对象(存储到一个文件)
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.out"));
oos.writeObject("Save a object:\n");
oos.writeObject(new Person("Bruce", "123456"));
oos.close();
//反序列化,将该对象恢复(存储到一个文件)
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.out"));
String s = (String)ois.readObject();
Person p = (Person)ois.readObject();
System.out.println(s + p);
}
}
//输入如下信息
Save a object:
userName:David password:13579
控制序列化字段还可以使用Externalizable接口替代Serializable借口。此时需要定义一个默认构造器,否则将为得到一个异常(java.io.InvalidClassException: Person; Person; no
valid constructor);还需要定义两个方法(writeExternal()和readExternal())来控制要序列化的字段。
import java.io.*;
public class Person implements Externalizable {
private String userName;
private String password;
public Person() {
System.out.println("default constructor invoked!");
}
public Person(String userName, String password) {
this.userName = userName;
this.password = password;
}
public String toString() {
return "userName:" + userName + " password:" + password;
}
public void writeExternal(ObjectOutput out) throws IOException {
//序列化字段
out.writeObject(userName);
out.writeObject(password);
}
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
//反序列化字段
userName = (String)in.readObject();
password = (String)in.readObject();
}
public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
//序列化一个对象(存储到一个文件)
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.out"));
oos.writeObject("Save a object:\n");
oos.writeObject(new Person("Leo", "1984"));
oos.close();
//反序列化,将该对象恢复(存储到一个文件)
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.out"));
String s = (String)ois.readObject();
Person p = (Person)ois.readObject();
System.out.println(s + p);
}
}
//输入如下信息
default constructor invoked!
Save a object:
userName:Leo password:1984
以上方式只能恢复成Java对象,如果想要恢复成其他对象(如C++对象),那就要将Java对象转换为XML格式,这样可以使其被各种平台和各种语言使用。可以使用随JDK一起发布的javax.xam.*类库,或者使用开源XOM类库(可以从www.xom.nu下载并获得文档)。
发表评论
-
理解并解决GBK转UTF-8奇数中文乱码
2011-06-18 21:29 27223最近在做一个反馈功能,把数据反馈到对方公司网站,我公司是GBK ... -
Java创建对象的四种方法
2010-12-24 15:10 1263package test; import java ... -
文件上传
2010-12-16 09:42 1092我用Excel数据导入来说明文件上传问题 <form ... -
GBK编码转成UTF-8编码
2010-12-03 15:49 1519从GBK编码转成UTF-8编码 private String ... -
HttpClient请求
2010-11-24 18:22 1625一个apache的httpclient简单范本,常用在WebS ... -
接收任意个字符串的方法
2010-11-10 11:32 1139public class MutilStringParamsD ... -
有状态会话Bean(SLSB)和无状态会话Bean(SFSB)的区别(转)
2010-09-26 10:01 1919Session Bean:分有状态 ... -
ThreadLocal解决线程安全问题
2010-09-25 16:55 3309//以下代码存在问题 pub ... -
AOP之Hello World
2010-09-14 23:41 1143目标 package com.aop.joinpoint; ... -
理解Socket
2010-09-03 00:31 1301服务器端代码: import java.io.Buffered ... -
理解TreeSet.add()方法
2010-08-31 17:35 3298Set存放不同元素,TreeSet存放不同元素,并且对元素进行 ... -
一道Java面试题
2010-08-25 15:40 1325有两组字符串,A组["A","B ... -
理解+=操作符
2010-08-23 14:52 992今天看到一篇文章(下面给出原文链接),对作者的错误理解予以纠正 ... -
更深入地理解自增自减运算符
2010-08-20 17:27 1190public class DeepTest { public ... -
理解重载与重写
2010-08-20 15:51 1116今天有个朋友问我重载与覆盖的区别,所以我就写好了发给他。在这贴 ... -
暴露属性不安全?
2010-08-17 20:19 1244我们在看书的时候常常看到书上说暴露属性不安全,那么请问下哪里不 ... -
理解继承
2010-08-10 11:52 993这个例子涉及到继承与 ... -
获取properties配置文件信息
2010-08-10 11:32 1731import java.io.IOException; imp ... -
中文字符按拼音排序
2010-06-01 13:12 1647java.util.Comparator cmp = java ... -
线程并发
2010-05-25 21:01 1221进程:表示一个任务。 线程:一种比进程更小的执行单位,依附在进 ...
相关推荐
Serializable是Java提供的一个接口,它是最简单也最常用的序列化方式。只需让类实现Serializable接口,系统就会自动处理序列化和反序列化。使用`writeObject()`和`readObject()`方法可以自定义序列化的行为。 优点...
在Java中,如果一个类实现了Serializable接口,那么该类的对象就可以被序列化。序列化的目的是为了保存对象的状态以便后续使用或在网络上传输。 Hessian,由Caucho Technology开发,是一种二进制的序列化格式。相比...
Java序列化和反序列化是Java开发中常见且重要的概念,它们主要用于对象的状态持久化以及在不同系统间传递数据。本库专注于将Java对象转换为JSON格式,这在Web服务、API开发、数据存储和传输等方面都有广泛的应用。...
Java序列化是指将对象的状态信息转换为可以存储或传输的形式的过程。相反,反序列化则是在适当的时候把这个流转换回原对象的过程。当应用程序接收来自不受信任源的数据并进行反序列化时,可能触发安全漏洞。例如,...
在Java中,将Java对象的数据封装成XML格式的字符串,通常涉及到对象序列化的过程。对象序列化是将对象的状态转换为字节流,以便存储或在网络上传输。这个过程可以通过实现`java.io.Serializable`接口来完成。反序列...
Java序列化是一项核心功能,它允许程序员将对象的状态转化为字节流的形式,从而实现对象的持久化存储或者在网络之间进行传递。这对于诸如远程方法调用(RMI)、分布式计算、对象存储以及缓存管理等场景至关重要。下面...
Java提供了Serializable接口,实现了这个接口的对象可以通过ObjectOutputStream进行序列化,然后通过ObjectInputStream在另一端进行反序列化,从而实现数据的交换。 此外,为了提升用户体验,聊天器可能还会涉及到...
Java的对象永续之道,主要探讨了Java中对象的持久化技术——序列化(serialization)的原理与实践。在计算机科学中,对象的持久性是指将内存中的数据转换为持久存储形式,如硬盘上的文件,以便在系统重启后仍能保留...
### Java序列化的秘密 #### 为什么需要序列化 在探讨序列化之前,我们需要理解序列化产生的背景及其必要性。简而言之,Java程序本质上是由进程和内存构成的系统,在这个系统中,进程根据定义好的类生成一系列实例...
- **对象序列化**:通过实现Serializable接口,可以将Java对象转换为字节流,便于存储和网络传输。 7. **网络编程** - **Socket编程**:Java提供了Socket和ServerSocket类进行网络通信,建立TCP连接。 - **URL和...
- Java序列化是一种将Java对象的状态转换为字节数组的方法,以便于存储或在网络间传输。 - 序列化机制依赖于`java.io.ObjectInputStream`和`java.io.ObjectOutputStream`类,以及对象类实现了`Serializable`接口。...
2. **数据序列化与反序列化**:为了持久化雇员对象,JAVA提供了`Serializable`接口。实现这个接口的对象可以通过`ObjectOutputStream`写入文件,然后通过`ObjectInputStream`读取。这样可以将对象的状态保存到磁盘并...
当一个类实现了`Serializable`接口后,Java的序列化机制就能处理这个类的对象。 - **自定义序列化**:在某些情况下,开发者可能需要更精细地控制序列化的过程。可以通过实现`Externalizable`接口来自定义序列化逻辑...
本文主要讨论Android特有的序列化方式——`Parcelable`接口,以及它与Java标准序列化`Serializable`接口的区别。 `Parcelable`接口是Android框架提供的一种高效的数据序列化方式,主要用于那些需要频繁在内存、...
Java提供了一种机制,允许对象实现 `Serializable` 接口后自动完成序列化过程。对于需要更精确控制序列化的对象,可以实现 `Externalizable` 接口。 - **`Serializable` 接口**:这是一个标记接口,没有方法定义。...
Java反序列化漏洞利用是Java安全领域中的一个重要话题,它涉及到程序执行流程中的一个环节——序列化与反序列化。序列化是将对象的状态转换为字节流的过程,便于存储或网络传输;反序列化则是将字节流恢复为对象的...
Java序列化是将对象的状态转换为字节流的过程,以便可以存储在磁盘上或者在网络上传输。要使一个类可序列化,你需要让该类实现`java.io.Serializable`接口。例如: ```java public class MyObject implements ...
这个类实现了Serializable接口,确保消息能在网络间进行序列化传输。 - **代码②**:MessageType枚举类定义了消息类型的常量,例如LOGIN_MESSAGE(登录消息)和TEXT_MESSAGE(文本消息),便于在程序中识别和处理不同...
JDK提供了一种内置的序列化机制,通过实现`Serializable`接口使类可以被序列化。在写入Redis时,可以使用`ObjectOutputStream`将Java对象转换为字节数组,然后通过Jedis的`set`方法存入Redis。反序列化时,使用`...
本篇文章将深入探讨如何通过Intent传递对象,以及涉及到的序列化方式——Serializable和Parcelable。 首先,Intent主要分为显式Intent和隐式Intent。显式Intent明确指定要启动的目标组件,而隐式Intent则通过ACTION...