serializable java里面 implements Serializable有什么作用
亲爱的读者们,你是否对serializable和java里面 implements Serializable有什么作用的相关问题感到困惑?别担心,今天我将为你解答这些问题,让你对此有更清晰的认识。
为什么要实现Serializable
最重要的两个原因是:
1、将对象的状态保存在存储媒体中以便可以在以后重新创建出完全相同的副本;
2、按值将对象从一个应用程序域发送至另一个应用程序域。
实现serializable接口的作用是就是可以把对象存到字节流,然后可以恢复。所以你想如果你的对象没实现序列化怎么才能进行网络传输呢,要网络传输就得转为字节流,所以在分布式应用中,你就得实现序列化,如果你不需要分布式应用,那就没那个必要实现序列化。
扩展资料:
public interface Serializable类通过实现 java.io.Serializable接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。序列化接口没有方法或字段,仅用于标识可序列化的语义。
要允许不可序列化类的子类型序列化,可以假定该子类型负责保存和还原超类型的公用(public)、受保护的(protected)和(如果可访问)包(package)字段的状态。仅在子类型扩展的类(父类)有一个可访问的无参数构造方法来初始化该类的状态时,才可以假定子类型有此责任。
如果不是这种情况,则声明一个类为可序列化类是错误的。该错误将在运行时检测到。
在反序列化过程中,将使用该类的公用或受保护的无参数构造方法初始化不可序列化类的字段。可序列化的子类必须能够访问无参数的构造方法。可序列化子类的字段将从该流中还原。
参考资料:百度百科-serializable接口
java里面 implements Serializable有什么作用
对象的串行化(Serialization)
一、串行化的概念和目的
1.什么是串行化
对象的寿命通常随着生成该对象的程序的终止而终止。有时候,可能需要将对象的状态保存下来,在需要时再将对象恢复。我们把对象的这种能记录自己的状态以便将来再生的能力。叫作对象的持续性(persistence)。对象通过写出描述自己状态的数值来记录自己,这个过程叫对象的串行化(Serialization)。串行化的主要任务是写出对象实例变量的数值。如果交量是另一对象的引用,则引用的对象也要串行化。这个过程是递归的,串行化可能要涉及一个复杂树结构的单行化,包括原有对象、对象的对象、对象的对象的对象等等。对象所有权的层次结构称为图表(graph)。
2.串行化的目的
Java对象的单行化的目标是为Java的运行环境提供一组特性,如下所示:
1)尽量保持对象串行化的简单扼要,但要提供一种途径使其可根据开发者的要求进行扩展或定制。
2)串行化机制应严格遵守Java的对象模型。对象的串行化状态中应该存有所有的关于种类的安全特性的信息。
3)对象的串行化机制应支持Java的对象持续性。
4)对象的串行化机制应有足够的可扩展能力以支持对象的远程方法调用(RMI)。
5)对象串行化应允许对象定义自身的格式即其自身的数据流表示形式,可外部化接口来完成这项功能。
二、串行化方法
从JDK1.1开始,Java语言提供了对象串行化机制,在java.io包中,接口Serialization用来作为实现对象串行化的工具,只有实现了Serialization的类的对象才可以被串行化。
Serializable接口中没有任何的方法。当一个类声明要实现Serializable接口时,只是表明该类参加串行化协议,而不需要实现任何特殊的方法。下面我们通过实例介绍如何对对象进行串行化。
1.定义一个可串行化对象
一个类,如果要使其对象可以被串行化,必须实现Serializable接口。我们定义一个类Student如下:
importjava.io.Serializable;
publicclassStudentimplementsSerializable{
intid;//学号
Stringname;//姓名
intage;//年龄
Stringdepartment;//系别
publicStudent(intid,Stringname,intage,Stringdepartment){
this.id=id;
this.name=name;
this.age=age;
this.department=department;
}
}
2.构造对象的输入/输出流
要串行化一个对象,必须与一定的对象输出/输入流联系起来,通过对象输出流将对象状态保存下来,再通过对象输入流将对象状态恢复。
java.io包中,提供了ObjectInputStream和ObjectOutputStream将数据流功能扩展至可读写对象。在ObjectInputStream中用readObject()方法可以直接读取一个对象,ObjectOutputStream中用writeObject()方法可以直接将对象保存到输出流中。
importjava.io.FileInputStream;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.ObjectInputStream;
importjava.io.ObjectOutputStream;
publicclassObjectSer{
publicstaticvoidmain(Stringargs[])throwsIOException,
ClassNotFoundException{
Studentstu=newStudent(981036,"LiuMing",18,"CSD");
FileOutputStreamfo=newFileOutputStream("data.ser");
ObjectOutputStreamso=newObjectOutputStream(fo);
try{
so.writeObject(stu);
so.close();
}catch(IOExceptione){
System.out.println(e);
}
stu=null;
FileInputStreamfi=newFileInputStream("data.ser");
ObjectInputStreamsi=newObjectInputStream(fi);
try{
stu=(Student)si.readObject();
si.close();
}catch(IOExceptione)
{
System.out.println(e);
}
System.out.println("StudentInfo:");
System.out.println("ID:"+stu.id);
System.out.println("Name:"+stu.name);
System.out.println("Age:"+stu.age);
System.out.println("Dep:"+stu.department);
}
}
运行结果如下:
Student Info:
ID:981036
Name:LiuMing
Age:18
Dep:CSD
在这个例子中,我们首先定义了一个类Student,实现了Serializable接口,然后通过对象输出流的writeObject()方法将Student对象保存到文件 data.ser中。之后,通过对家输入流的readObjcet()方法从文件data.ser中读出保存下来的Student对象。从运行结果可以看到,通过串行化机制,可以正确地保存和恢复对象的状态。
三、串行化的注意事项
1.串行化能保存的元素
串行化只能保存对象的非静态成员交量,不能保存任何的成员方法和静态的成员变量,而且串行化保存的只是变量的值,对于变量的任何修饰符都不能保存。
2.transient关键字
对于某些类型的对象,其状态是瞬时的,这样的对象是无法保存其状态的。例如一个Thread对象或一个FileInputStream对象,对于这些字段,我们必须用transient关键字标明,否则编译器将报措。
另外,串行化可能涉及将对象存放到磁盘上或在网络上发达数据,这时候就会产生安全问题。因为数据位于Java运行环境之外,不在Java安全机制的控制之中。对于这些需要保密的字段,不应保存在永久介质中,或者不应简单地不加处理地保存下来,为了保证安全性。应该在这些字段前加上transient关键字。
下面是java规范中对transient关键字的解释:
The transient marker is not fully specified by The Java Language Specification but is used in object serialization to mark member variables that should not be serialized.
以下是transient的一个应用举例:
//LoggingInfo.java
importjava.io.FileInputStream;
importjava.io.FileOutputStream;
importjava.io.ObjectInputStream;
importjava.io.ObjectOutputStream;
importjava.util.Date;
publicclassLoggingInfoimplementsjava.io.Serializable{
privatestaticfinallongserialVersionUID=1L;
privateDateloggingDate=newDate();
privateStringuid;
privatetransientStringpwd;
LoggingInfo(Stringuser,Stringpassword){
uid=user;
pwd=password;
}
publicStringtoString(){
Stringpassword=null;
if(pwd==null){
password="NOTSET";
}else{
password=pwd;
}
return"logoninfo:\n"+"user:"+uid+"\nloggingdate:"+loggingDate.toString()+"\npassword:"+password;
}
publicstaticvoidmain(String[]args){
LoggingInfologInfo=newLoggingInfo("MIKE","MECHANICS");
System.out.println(logInfo.toString());
try{
ObjectOutputStreamo=newObjectOutputStream(newFileOutputStream("logInfo.out"));
o.writeObject(logInfo);
o.close();
}catch(Exceptione){//dealwithexception
}
//Toreadtheobjectback,wecanwrite
try{
ObjectInputStreamin=newObjectInputStream(newFileInputStream("logInfo.out"));
LoggingInfologInfo1=(LoggingInfo)in.readObject();
System.out.println(logInfo1.toString());
}catch(Exceptione){//dealwithexception
}
}
}
C#里serializable是什么意思
序列化
序列化是指存储和获取磁盘文件、内存或其他地方中的对象。在序列化时,所有的实例数据都保存到存储介质上,在取消序列化时,对象会被还原,且不能与其原实例区别开来。
只需给类添加Serializable属性,就可以实现序列化实例的成员。
并行化是序列化的逆过程,数据从存储介质中读取出来,并赋给类的实例变量。
[Serializable]
public class Person
{
public Person()
{
}
public int Age;
public int WeightInPounds;
}
下面来看一个小例子,首先要添加命名空间
using System.Runtime.Serialization.Formatters.Binary;
下面的代码将对象Person进行序列化并存储到一个文件中
Person me= new Person();
me.Age= 34;
me.WeightInPounds= 200;
Stream s= File.Open("Me.dat",FileMode.Create);
BinaryFormatter bf= new BinaryFormatter();
bf.Serialize(s,me);
s.Close();
如果需要对部分字段序列化部分不序列化时,我们可以按照如下设置实现
[Serializable]
public class Person
{
public Person()
{}
public int Age;
[NonSerialized]
public int WeightInPounds;
}
好了,关于serializable和java里面 implements Serializable有什么作用的问题到这里结束啦,希望可以解决您的问题哈!