??xml version="1.0" encoding="utf-8" standalone="yes"?>
<%@ page contentType="image/jpeg"
import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*"%>
<%!Color getRandColor(int fc, int bc) {//l定范围获得随机颜色
Random random = new Random();
if (fc > 255)
fc = 255;
if (bc > 255)
bc = 255;
int r = fc + random.nextInt(bc - fc);
int g = fc + random.nextInt(bc - fc);
int b = fc + random.nextInt(bc - fc);
return new Color(r, g, b);
}%>
<%
//讄面不缓?br />
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
// 在内存中创徏图象
int width = 60, height = 20;
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
// 获取囑Ş上下?br /> Graphics g = image.getGraphics();
//生成随机c?br /> Random random = new Random();
// 讑֮背景?br />
g.setColor(getRandColor(200, 250));
g.fillRect(0, 0, width, height);
//讑֮字体
g.setFont(new Font("Times New Roman", Font.PLAIN, 18));
//画边?br />
//g.setColor(new Color());
//g.drawRect(0,0,width-1,height-1);
// 随机产生155条干扰线Q图象中的认证码不易被其它E序探测?br />
g.setColor(getRandColor(160, 200));
for (int i = 0; i < 155; i++) {
int x = random.nextInt(width);
int y = random.nextInt(height);
int xl = random.nextInt(12);
int yl = random.nextInt(12);
g.drawLine(x, y, x + xl, y + yl);
}
// 取随Z生的认证?4位数?
String sRand = "";
for (int i = 0; i < 4; i++) {
String rand = String.valueOf(random.nextInt(10));
sRand += rand;
// 认证码昄到图象中
g.setColor(new Color(20 + random.nextInt(110), 20 + random
.nextInt(110), 20 + random.nextInt(110)));
//调用函数出来的颜色相同,可能是因为种子太接近Q所以只能直接生?br />
g.drawString(rand, 13 * i + 6, 16);
}
// 认证码存入SESSION
session.setAttribute("rand", sRand);
// 图象生效
g.dispose();
// 输出图象到页?br />
ImageIO.write(image, "JPEG", response.getOutputStream());
%>
一般报java.lang.NullPointerException的原因有以下几种Q?
·字符串变量未初始化;
·接口cd的对象没有用具体的类初始化,比如Q?
List ltQ会(x)报错
List lt = new ArrayList()Q则不会(x)报错?
·当一个对象的gؓ(f)I时Q你没有判断为空的情c(din)?
你可以试着把下面的代码前加一行代码:(x)
if(rb!=null && rb!="")
Ҏ(gu)Q?
if(rb==null);
if(rb!==null&&rb!="")
解决步骤Q?/p>
1、打开Console面板Q找到出错信息?/p>
2、从打印出来的信息中扑և一个文件及(qing)其出错行数?/p>
3、在出错行处讄断点Q重新执行程序?/p>
4、打开Variables视图Q从中查扑և错行所用到的所有对象及(qing)其|如果其中对象的gؓ(f)I,则可以进一步分析问题?/p>
5、如果该行的对象都不为空而是调用了一个函敎ͼ则到q个函数里设|断点(或step into F5 Q,l箋q行调试。这旉要用F6Q执行一行)(j)Q直到再ơ报错,从而定位到出错处。重复步?.
6、结束?/p>
如果不会(x)断点,教你个狠?你把用到的变量都输出出来,q道谁是NULL?然后在想办法Ҏ(gu),q单多?/p>
本文来自CSDN博客Q{载请标明出处Qhttp://blog.csdn.net/aisitemasu/archive/2008/05/29/2493246.aspx
W一Q在web.xml文g<web-app> <servlet>"把下面的内容攑֜q里"</servlet></web-app>中加?/p>
<init-param>
<param-name>application</param-name>
<param-value>ApplicationResources</param-value>
</init-param>
W二Q在struts-config.xml中加入如下设|:(x)
<message-resources parameter="ApplicationResources"/>
该设|最好放在:(x)</action-mappings>"攑ֈq里"</struts-config>
W三Q确?font color="#0000ff">ApplicationResources.properties文g在你建立的WEB-INF\classes文g夹中?/p>
可以把applicationResources.properties攑ֈclasses文g夹下其它目录Q例如:(x)
把ApplicationResources.properties攑օWEB-INF\classes\mydir文g夹下?strong>struts-config.xml中的讄必须?/p>
<message-resources parameter="mydir/ApplicationResources"/>
W四Q就可能是键值的问题Qstruts的资源文件也是可以分多资源文仉|的Q比如配备是q样?/p>
<message-resources parameter="ApplicationResources" key="myAppRes"/>
如果只有一个带key的资源文Ӟ那就?x)抛?strong> org.apache.struts.action.MESSAGE错误?删除key卛_?br />
解除oracle10g密码锁定
oracle10g密码被锁定了Q这么搞定它Qcmd?/p>
>sqlplus /nolog
>conn sys/password as sysdba
更改锁定的密码:(x)
执行ALTER USER DBSNMP ACCOUNT UNLOCKQ?/p>
从新用SQL/PLUSdQ设|用户名、密码;
注:(x)׃刚才解锁的用户名是DBSNMPQ所以这里设|的用户名也是DBSNMP
Oracle
Username |
Password |
Description |
See Also |
CTXSYS |
CTXSYS |
The Oracle Text account |
Oracle Text Reference |
DBSNMP |
DBSNMP |
The account used by the Management Agent component of Oracle Enterprise Manager to monitor and manage the database |
Oracle Enterprise Manager Grid Control Installation and Basic Configuration |
LBACSYS |
LBACSYS |
The Oracle Label Security administrator account |
Oracle Label Security Administrator's Guide |
MDDATA |
MDDATA |
The schema used by Oracle Spatial for storing Geocoder and router data |
Oracle Spatial User's Guide and Reference |
MDSYS |
MDSYS |
The Oracle Spatial and Oracle interMedia Locator administrator account |
Oracle Spatial User's Guide and Reference |
DMSYS |
DMSYS |
The Oracle Data Mining account. |
Oracle Data Mining Administrator's Guide Oracle Data Mining Concepts |
OLAPSYS |
MANAGER |
The account used to create OLAP metadata structures. It owns the OLAP Catalog (CWMLite). |
Oracle OLAP Application Developer's Guide |
ORDPLUGINS |
ORDPLUGINS |
The Oracle interMedia user. Plug-ins supplied by Oracle and third party format plug-ins are installed in this schema. |
Oracle interMedia User's Guide |
ORDSYS |
ORDSYS |
The Oracle interMedia administrator account |
Oracle interMedia User's Guide |
OUTLN |
OUTLN |
The account that supports plan stability. Plan stability enables you to maintain the same execution plans for the same SQL statements. OUTLN acts as a role to centrally manage metadata associated with stored outlines. |
Oracle Database Performance Tuning Guide |
SI_INFORMTN_SCHEMA |
SI_INFORMTN_SCHEMA |
The account that stores the information views for the SQL/MM Still Image Standard |
Oracle interMedia User's Guide |
SYS |
CHANGE_ON_INSTALL |
The account used to perform database administration tasks |
Oracle Database Administrator's Guide |
SYSMAN |
CHANGE_ON_INSTALL |
The account used to perform Oracle Enterprise Manager database administration tasks. Note that SYS and SYSTEM can also perform these tasks. |
Oracle Enterprise Manager Grid Control Installation and Basic Configuration |
SYSTEM |
MANAGER |
Another account used to perform database administration tasks. |
本文来自德仔工作?http://www.dezai.cn
String encoding = "gb2312"; char c[] = {'u4f60'}; CharToByteConverter converter = CharToByteConverter.getConverter(encoding); byte b[] = converter.convertAll(c); for (int i = 0; i < b.length; i++) { System.out.println(Integer.toHexString(b[i])); }
String encoding = "gb2312"; char c[] = {'u4f60'}; CharToByteConverter converter = CharToByteConverter.getDefault(); byte b[] = converter.convertAll(c); for (int i = 0; i < b.length; i++) { System.out.println(Integer.toHexString(b[i])); }
String encoding = "gb2312"; InputStreamReader reader = new InputStreamReader(new FileInputStream( "text.txt"), encoding); char c[] = new char[10]; int length = reader.read(c); for (int i = 0; i < length; i++) { System.out.println(c[i]); }
<web-app> <filter> <filter-name>RequestFilter</filter-name> <filter-class>net.golden.uirs.util.RequestFilter</filter-class> <init-param> <param-name>charset</param-name> <param-value>gb2312</param-value> </init-param> </filter> <filter-mapping> <filter-name>RequestFilter</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping> </web-app>
public void doFilter(ServletRequest req, ServletResponse res, FilterChain fChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; HttpSession session = request.getSession(); String userId = (String) session.getAttribute("userid"); req.setCharacterEncoding(this.filterConfig.getInitParameter("charset")); // 讄字符集?实际上是讄了byte ??〉char的encoding try { if (userId == null || userId.equals("")) { if (!request.getRequestURL().toString().matches( ".*/uirs/logon/logon(Controller){0,1}x2Ejsp$")) { session.invalidate(); response.sendRedirect(request.getContextPath() + "/uirs/logon/logon.jsp"); } } else { // 看看是否h信息上报pȝ的权?/span> if (!net.golden.uirs.util.UirsChecker.check(userId, "信息上报pȝ", net.golden.uirs.util.UirsChecker.ACTION_DO)) { if (!request.getRequestURL().toString().matches( ".*/uirs/logon/logon(Controller){0,1}x2Ejsp$")) { response.sendRedirect(request.getContextPath() + "/uirs/logon/logonController.jsp"); } } } } catch (Exception ex) { response.sendRedirect(request.getContextPath() + "/uirs/logon/logon.jsp"); } fChain.doFilter(req, res); }
目前|络上关于对象序列化的文章不,但是我发现详l叙q用法和原理的文章太。本人把自己l过l验ȝ和实际运用中的体?x)写成的学?fn)W记贡献l大家。希望能为整个javaC的繁荣做一点事情?br />
序列化的q程是对象写入字节和从字节流中读取对象。将对象状态{换成字节之后,可以用java.io包中的各U字节流cd其保存到文g中,道到另 一U程中或通过|络q接对象数据发送到另一L。对象序列化功能非常单、强大,在RMI、Socket、JMS、EJB都有应用。对象序列化问题在网 l编E中q不是最Ȁ动h心的NQ但却相当重要,h许多实用意义?br />
一Q对象序列化可以实现分布式对象?br />
主要应用例如QRMI要利用对象序列化q行q程L上的服务Q就像在本地Zq行对象时一栗?/p>
二:(x) java对象序列化不仅保留一个对象的数据Q?/font>而且递归保存对象引用的每个对象的数据。可以将整个对象层次写入字节中Q可以保存在文g中或在网l连接上?递。利用对象序列化可以q行对象?#8220;深复?#8221;Q即复制对象本n?qing)引用的对象本n。序列化一个对象可能得到整个对象序列?br />
从上面的叙述中,我们知道了对象序列化是java~程中的必备武器Q那么让我们从基开始,好好学习(fn)一下它的机制和用法?
java 序列化比较简单,通常不需要编写保存和恢复对象状态的定制代码。实现java.io.Serializable接口的类对象可以转换成字节流或从字节恢 复,不需要在cM增加M代码。只有极数情况下才需要定制代码保存或恢复对象状态。这里要注意Q不是每个类都可序列化,有些cL不能序列化的Q例如涉?U程的类与特定JVM有非常复杂的关系?br />
序列化机Ӟ(x)
序列化分Z大部分:(x)序列化和反序列化?序列化是q个q程的第一部分Q将数据分解成字节流Q以便存储在文g中或在网l上传输。反序列化就是打开字节ƈ重构对象。对象序列化不仅要将基本数据cd 转换成字节表C,有时q要恢复数据。恢复数据要求有恢复数据的对象实例。ObjectOutputStream中的序列化过E与字节连接,包括对象cd 和版本信息。反序列化时QJVM用头信息生成对象实例Q然后将对象字节中的数据复制到对象数据成员中。下面我们分两大部分来阐qͼ(x)
处理对象:(x)
Q序列化q程和反序列化过E)(j)
java.io包有两个序列化对象的cRObjectOutputStream负责对象写入字节流QObjectInputStream从字节流重构对象?br />
我们先了解ObjectOutputStreamcd。ObjectOutputStreamcL展DataOutput接口?br />
writeObject ()Ҏ(gu)是最重要的方法,用于对象序列化。如果对象包含其他对象的引用Q则writeObject()Ҏ(gu)递归序列化这些对象。每?ObjectOutputStreaml护序列化的对象引用表,防止发送同一对象的多个拷贝。(q点很重要)(j)׃writeObject()可以序列化整 l交叉引用的对象Q因此同一ObjectOutputStream实例可能不小心被h序列化同一对象。这Ӟq行反引用序列化Q而不是再ơ写入对象字??br />
下面Q让我们从例子中来了解ObjectOutputStreamq个cd?br />
1. // 序列?today's date C个文件中.
2. FileOutputStream f = new FileOutputStream("tmp");
3. ObjectOutputStream s = new ObjectOutputStream(f);
4. s.writeObject("Today");
5. s.writeObject(new Date());
6. s.flush();
现在Q让我们来了解ObjectInputStreamq个cR它?ObjectOutputStream怼。它扩展DataInput接口。ObjectInputStream中的Ҏ(gu)镜像 DataInputStream中读取Java基本数据cd的公开Ҏ(gu)。readObject()Ҏ(gu)从字节流中反序列化对象。每ơ调?readObject()Ҏ(gu)都返回流中下一个Object。对象字节流q不传输cȝ字节码,而是包括cd?qing)其{。readObject()收到对象 ӞJVM装入头中指定的类。如果找不到q个c,则readObject()抛出ClassNotFoundException,如果需要传输对象数据和 字节码,则可以用RMI框架。ObjectInputStream的其余方法用于定制反序列化过E?br />
例子如下Q?br />
1. //从文件中反序列化 string 对象?date 对象
2. FileInputStream in = new FileInputStream("tmp");
3. ObjectInputStream s = new ObjectInputStream(in);
4. String today = (String)s.readObject();
5. Date date = (Date)s.readObject();
定制序列化过E?
序列化通常可以自动完成Q但有时可能要对q个q程q行控制。java可以类声明为serializableQ但仍可手工控制声明为static或transient的数据成员?br />
例子Q一个非常简单的序列化类?br />
1. public class simpleSerializableClass implements Serializable{
2. String sToday="Today:";
3. transient Date dtToday=new Date();
4. }
序列化时Q类的所有数据成员应可序列化除了声明为transient或static的成员。将变量声明?transient告诉JVM我们?x)负责将变元序列化。将数据成员声明为transient后,序列化过E就无法其加进对象字节中Q没有从 transient数据成员发送的数据。后面数据反序列化时Q要重徏数据成员Q因为它是类定义的一部分Q,但不包含M数据Q因个数据成员不向流中写 入Q何数据。记住,对象不序列化static或transient。我们的c要用writeObject()与readObject()Ҏ(gu)以处理这?数据成员。用writeObject()与readObject()Ҏ(gu)Ӟq要注意按写入的序dq些数据成员?br />
关于如何使用定制序列化的部分代码如下Q?br />
1. //重写writeObject()Ҏ(gu)以便处理transient的成员?
2. public void writeObject(ObjectOutputStream outputStream) throws IOException{
3. outputStream.defaultWriteObject();//使定制的writeObject()Ҏ(gu)可以
4. 利用自动序列化中内置的逻辑?
5. outputStream.writeObject(oSocket.getInetAddress());
6. outputStream.writeInt(oSocket.getPort());
7. }
8. //重写readObject()Ҏ(gu)以便接收transient的成员?
9. private void readObject(ObjectInputStream inputStream) throws IOException,ClassNotFoundException{
10. inputStream.defaultReadObject();//defaultReadObject()补充自动序列?
11. InetAddress oAddress=(InetAddress)inputStream.readObject();
12. int iPort =inputStream.readInt();
13. oSocket = new Socket(oAddress,iPort);
14. iID=getID();
15. dtToday =new Date();
16. }
完全定制序列化过E?
如果一个类要完全负责自q序列化,则实?Externalizable接口而不是Serializable接口。Externalizable接口定义包括两个Ҏ(gu)writeExternal ()与readExternal()。利用这些方法可以控制对象数据成员如何写入字节流.cd现ExternalizableӞ头写入对象流中,然后c?完全负责序列化和恢复数据成员Q除了头以外Q根本没有自动序列化。这里要注意了。声明类实现Externalizable接口?x)有重大的安全风险?writeExternal()与readExternal()Ҏ(gu)声明为publicQ恶意类可以用这些方法读取和写入对象数据。如果对象包含敏感信 息,则要格外心。这包括使用安全套接或加密整个字节流。到此ؓ(f)臻I我们学习(fn)了序列化的基部分知识.
}
?serialPersistentFields 为某个类定义可序列化域后Q即无需再将可序列化域限制在当前 Serializable cȝ定义之内。利用第 1.7 节,"讉Kcȝ可序列化? 中描q的接口QSerializable cȝ writeObject ?readObject Ҏ(gu)可将该类的当前实现映到其可序列化域。因此,后箋版本中可以改?Serializable cȝ域,但前提是保持与版本兼容的 Serializable 域的映射?/p>
1.6 对类的可序列化域和数据存?br /> 对类的可序列化状态进行存档以使其?Serializable cȝ其它实现间可互操作,或者对cL变进行存档,q些都非常必要。对可序列化域进行存档可帮助用户最l确定该域是否应序列化?序列?javadoc 标记 @serial、@serialField ?@serialData 可提供对源代码中 Serializable cȝ序列化Ş式进行存档的Ҏ(gu)?/p>
对于~省的可序列化域Q@serial 标记应放?javadoc 注释中。语法如下:(x)@serial field-description 其中可选项 field-description 描述域及(qing)其容许值的含义?field-description 可跨多行。当初始版本中增加一个域Ӟ@since 标记指出所d的版本。@serial ?field-description 提供针对序列化的文档。在序列化Ş式文档内Qfield-description 被d?javadoc 注释中?
@serialField 标记用于?serialPersistentFields 数组?ObjectStreamField lgq行存档。每?ObjectStreamField lg都应使用其中的一个标记。语法如下:(x)@serialField field-name field-type field-description
@serialData 标记描述写入或读取数据的ơ序和类型。该标记描述 writeObject 所写入的可选数据或 Externalizable.writeExternal Ҏ(gu)所写入的所有数据的ơ序或类型。语法如下:(x)@serialData data-description
javadoc 应用E序识别序列?javadoc 标记qؓ(f)每个 Serializable ?Externalizable cȝ成说明文字。有兌些标记用法的CZQ参见第 C.1 ?"java.io.File 可替代实现的CZ?
当某个类被声明ؓ(f) Serializable Ӟ即通过可序列化域及(qing)可选数据(按名U和cdQ定义了该对象的可序列化状态。可选数据只能用 Serializable cM?writeObject Ҏ(gu)昑ּ写入Q而其d则可通过 Serializable cd readObject Ҏ(gu)q行。否则,序列化将跌无法d的可选数据?
当一个类被声明ؓ(f) Externalizable Ӟ通过c自w写入流的数据即定义了该cȝ序列化状态?该类必须指定序、类型及(qing)写入的每个数据的含义。同时还必须处理其自w的演变Q从而可d以前版本所写入的数据,或写入以前版本所能读取的数据。在存储和恢复数据时Q该cdM父类怸致。必L定流中父cL据的位置?/p>
cȝ设计者必ȝ保ؓ(f)cd储的信息对于持久性是合适的Q而且遵@为实现序列化的互操作性和演变而指定的序列化规则。第 5 ?#8220;可序列化对象的版本演?#8221;对类的演变进行了更详l的说明?
1.10 Serializable 接口
Serialization 对象生成,其中提供有关所存对象的 JavaTM cȝ信息。对于可序列化对象,即存在该类的不同(但兼容)(j)版本的实玎ͼ也要保持_的信息以恢复q些对象。定?Serializable 接口可以标识实现可序列化协议的类Q?/p>
package java.io;
public interface Serializable {};
Serializable cdd备如下功能:(x)
实现 java.io.Serializable 接口
标识应序列化的域
(使用 serialPersistentFields 成员以显式声明其可序列化Q或者用瞬态关键字来指C非序列域?
可访问其W一个非序列化父cȝ无参数构造函数?
该类可根据需要定义如下方法:(x)
writeObject Ҏ(gu)Q用于控制要保存哪些信息或将附加信息d到流?
readObject Ҏ(gu)Q用于读取由相应 writeObject Ҏ(gu)写入的信息,或在对象恢复后更新其状?
writeReplace Ҏ(gu)Q用于允许类指定写入的替换对象
readResolve Ҏ(gu)Q用于允许类为刚从流中读取的对象指定替换对象
ObjectOutputStream ?ObjectInputStream 支持所操作的可序列化类的演变(允许cd生改变以兼容早期版本的类Q。有兛_现兼容变化的机制的信息,参见W?5.5 ?#8220;兼容?JavaTM cd演变”?br />
--------------------------------------------------------------------------
class ObjectYouWannaSave implements Serializable{
int x; int y;
SubObject so = new SubObject();
..........
}
class SubObject implements Serializable{
String s = "abc"; //String is OK, because String is java.io.Serializable
}
public class Save{ // in Save.java
public void main(String[] args) {
ObjectYouWannaSave original = new ObjectYouWannaSave();
original.x = -1; original.y = 100; .....
ObjectOutputStream out = null;
try{
out = new ObjectOutputStream(new FileOutputStream(new File("c:/save.dat")));
out.writeObject(original);
}catch(Exceptione){
}finally{
try{out.close();}catch(Exception e){}
}
}
}
public class Read{ // in Read.java
public void main(String[] args) {
ObjectInputStream in = null;
try{
out = new ObjectInStream(new FileInStream(new File("c:/save.dat")));
ObjectYouWannaSave o = (ObjectYouWannaSave)in.readObject();
System.out.println("x="+o.x);
System.out.println("subobject.string=" + o.so.s);
........
}catch(Exceptione){
}finally{
try{in.close();}catch(Exception e){}
}
}
}
q是个最单的例子Q先q行Save,以后什么时候运行Read都可以(只要c:\save.dat文gq存在就可以了)(j)
--------------------------------------------------
对象的寿命通常随着生成该对象的E序l止而终止,有时候,可能需要将对象的状态保存下来,在需要的时?br />
再将对象恢复Q我们把对象的这U记录自q态的以便来再生的能力,叫做对象的持l性(PERSISTENCEQ,
对象通过写出描述自己状态的数值来记录自己Q这个过E叫对象的串行化Serializable。串行化的主要Q务是?br />
出对象实例变量的倹{如果变量是另一个对象的引用Q则引用的对象也要串行化Q这是个递归q程?br />
--------------------------------------------------------------------
java.io.Serializable interface是一个较为特D的接口Q?br />
The serialization interface has no methods or fields and serves
only to identify the semantics of being serializable
卻I(x)它主要是一个用于通知JVM的标?/p>
class X implements java.io.Serializable{...}
如果你要定制你自qserializable行ؓ(f)Q你应该在X中实C?个方法:(x)
private void writeObject(java.io.ObjectOutputStream out)
throws IOException
private void readObject(java.io.ObjectInputStream in)
throws IOException, ClassNotFoundException;
否则按~省的策略进行?/p>
׃上述2个方法是private的,所以在某些情况下,可以使用
java.io.Serializable的子接口java.io.ExternalizableQ?br />
在这个interface中有2个publicҎ(gu)Q?/p>
public void writeExternal(ObjectOutput out)
throws IOException
public void readExternal(ObjectInput in)
throws IOException,
ClassNotFoundException
----------------------------------------------------------------------------
Serializable是一个串行化接口Q它没有M的属性和Ҏ(gu)Q一个类实现了串行化接口Q就表明
该类h持久性,通过WriteObjcet可将其持久保存在盘Q在需要时Q可用ReadObject从磁盘中dQ次Ӟ对象的状态和存入似的相同。上面给出的列子比较单,可通过串行化保存一?br />
链表对象Q它的每个节Ҏ(gu)据也?x)被保存?当然Q串行化接口q有其他用途,例如HTTP隧道{?br />
?br />
-----------------------------------------------------------------------
对象序列化的持箋性要和永久对象分别开。序列化只能辑ֈ有线持箋?br />
在同一个jvm上可以重构对象的内容Q达到持l?br />
---------------------------------------------------------------------
java序列化主要是用于两个斚wQ?br />
一个是java的RMIQ远E方法调用-Remote method invocationQ,你可以用别人机器上的对象就像在你自q机器上用它一P通过序列化)(j)Q另外,在用javabean时也需要用序列化Q序列化主要是使用在这两方面?br />
-------------------------------------------------------------
所谓序列化是把把对象以一个代码串的Ş式表C出来,
q样可以保存到磁盘或则通过|络传输Q接受方可以在把代码串恢复成对象
具体的串形化Ҏ(gu)可以自己写,接收攑ְ可以Ҏ(gu)(zhn)串形的规则把对象恢复出?br />
--------------------------------------------------------------------
序列化是把一个对象的状态写入一个字节流的过E,它执行RMIQRMI允许一台机器上的JAVA对象调用不同机器上的JAVA对象Ҏ(gu)Q对象可以作为参数提供给那个q程Ҏ(gu)Q发送机序列化该对象q传送它Q接收机执行反序列化?
序列化和反序列化的关pd表可形成包含循环引用的顺序图表。这是整个序列化的M思想?
而Serializable接口属于支持序列化的一个接口,只有一个实现它的对象可以被序列化工具存储和回复QSerializable接口没有定义M成员Q只用来表示一个篏可以被序列化Q若该类可以序列化,那么它的所有子c都可以?
下面是关于序列化的一个实例:(x)
[b:a55efb5f91]E序名称QSerializationDemo.java
E序主题Q实现对象的序列化和反序列化
E序说明Q该E序由实例化一个MyClasscȝ对象开始,该对象有三个实例变量Q类型分别ؓ(f)String、int、doubleQ是希望存储和恢复的信息。[/b:a55efb5f91]
[code:1:a55efb5f91]
import java.io.*;
public class SerializationDemo{
public static void main(String args[]){
//Object serialization
try{
MyClass object1=new MyClass("Hello",-7,2.7e10);
System.out.println("object1:"+object1);
FileOutputStream fos=new FileOutputStream("serial");
ObjectOutputStream oos=new ObjectOutputStream(fos);
oos.writeObject(object1);
oos.flush();
oos.close();
}
catch(Exception e){
System.out.println("Exception during serialization:"+e);
System.exit(0);
}
//Object deserialization
try{
MyClass object2;
FileInputStream fis=new FileInputStream("serial");
ObjectInputStream ois=new ObjectInputStream(fis);
object2=(MyClass)ois.readObject();
ois.close();
System.out.println("object2:"+object2);
}
catch(Exception e){
System.out.println("Exception during deserialization:"+e);
System.exit(0);
}
}
}
class MyClass implements Serializable{
String s;
int i;
double d;
public MyClass(String s,int i,double d){
this.s=s;
this.i=i;
this.d=d;
}
public String toString(){
return "s="+s+";i="+i+";d="+d;
}
}
[/code:1:a55efb5f91]
E序q行l果Qobject1和object2的实例变量是一L(fng)Q输出如下:(x)[code:1:a55efb5f91]object1:s=Hello;i=-7;d=2.7E10
object2:s=Hello;i=-7;d=2.7E10[/code:1:a55efb5f91]
--------------------------------------------------------------------------------
Object serialization的定义:(x)
Object serialization 允许你将实现了Serializable接口的对象{换ؓ(f)字节序列Q这些字节序列可以被完全存储以备以后重新生成原来的对象?nbsp;
serialization不但可以在本机做Q而且可以l由|络操作Q就是猫说的RMIQ。这个好处是很大?---因ؓ(f)它自动屏蔽了操作pȝ的差异,字节序Q用Unix下的c开发过|络~程的h应该知道q个概念Q我容易在q上面犯错)(j){。比如,在Windowq_生成一个对象ƈ序列化之Q然后通过|络传到一台Unix机器上,然后可以在这台Unix机器上正地重构q个对象?
Object serialization主要用来支持2U主要的Ҏ(gu):(x)
1。Java的RMI(remote method invocation).RMI允许象在本机上一h作远E机器上的对象。当发送消息给q程对象Ӟ需要用到serializaiton机制来发送参数和接收q回直?
2。Java的JavaBeans. Bean的状态信息通常是在设计旉|的。Bean的状态信息必被存v来,以便当程序运行时能恢复这些状态信息。这也需要serializaiton机制?
二。持久化
持久化应该是英文里的persistence.但是Java语言里现在只支持lightweight persistence,是轻量U持久化Q这是通过serialization机制来实现的?
persistence是指一个对象的生命周期不由E序是否执行来决定,即是在E序l止时这个对象也存在。它把一个serializable的对象写到磁盘(本机或其他机器上的非RAM存储器)(j)Qƈ在程序重新调用时再读取对象到通常的RAM存储器?
Z么说Java的serialization机制实现的是lightweight persistence?因ؓ(f)你必L式的序列化和反序列化E序里的对象Q而不是直接由一个关键词来定义一个对象是序列化的然后ql做相应的处理?nbsp; 如果以后的Java版本出现一个新的关键字来实现这U机Ӟ比如是persistence,如果我用
persistence (String s="chinaunix")
然后pȝ自动做上面程序里的那些处理,那么Java实Cpersistence.