Java 什么是对象序列化?
“对象序列化”是什么意思?你能举例说明一下吗 序列化是将“活动”对象存储在内存中,并将其转换为可存储在某处(如内存、磁盘)的格式,然后再“反序列化”回活动对象。序列化是将对象的状态转换为位的过程,以便将其存储在硬盘上。当反序列化同一对象时,它将在以后保留其状态。它允许您重新创建对象,而无需手动保存对象的属性Java 什么是对象序列化?,java,serialization,object-serialization,Java,Serialization,Object Serialization,“对象序列化”是什么意思?你能举例说明一下吗 序列化是将“活动”对象存储在内存中,并将其转换为可存储在某处(如内存、磁盘)的格式,然后再“反序列化”回活动对象。序列化是将对象的状态转换为位的过程,以便将其存储在硬盘上。当反序列化同一对象时,它将在以后保留其状态。它允许您重新创建对象,而无需手动保存对象的属性 序列化是将对象转换为一系列字节,以便可以轻松地将对象保存到永久性存储或通过通信链路传输。然后可以反序列化字节流-将其转换为原始对象的副本。序列化是将Java对象转换为字节数组,然后再次转换为
序列化是将对象转换为一系列字节,以便可以轻松地将对象保存到永久性存储或通过通信链路传输。然后可以反序列化字节流-将其转换为原始对象的副本。序列化是将Java对象转换为字节数组,然后再次转换为保留状态的对象的过程。适用于通过网络发送对象或将对象缓存到磁盘等各种情况
阅读更多,然后转到。您可能还对阅读感兴趣。您可以将序列化看作是将对象实例转换为字节序列的过程(字节序列可能是二进制的,也可能不是二进制的,具体取决于实现) 当您希望通过网络传输一个对象数据时,例如从一个JVM传输到另一个JVM时,它非常有用 在Java中,序列化机制内置于平台中,但您需要实现可序列化接口以使对象可序列化 还可以通过将属性标记为瞬态来防止对象中的某些数据被序列化 最后,您可以覆盖默认机制,并提供自己的机制;这可能适用于某些特殊情况。要做到这一点,您可以使用其中一个 需要注意的是,序列化的是对象或内容的“值”,而不是类定义。因此,方法不会序列化 以下是一个非常基本的示例,带有注释,以便于阅读:
import java.io.*;
import java.util.*;
// This class implements "Serializable" to let the system know
// it's ok to do it. You as programmer are aware of that.
public class SerializationSample implements Serializable {
// These attributes conform the "value" of the object.
// These two will be serialized;
private String aString = "The value of that string";
private int someInteger = 0;
// But this won't since it is marked as transient.
private transient List<File> unInterestingLongLongList;
// Main method to test.
public static void main( String [] args ) throws IOException {
// Create a sample object, that contains the default values.
SerializationSample instance = new SerializationSample();
// The "ObjectOutputStream" class has the default
// definition to serialize an object.
ObjectOutputStream oos = new ObjectOutputStream(
// By using "FileOutputStream" we will
// Write it to a File in the file system
// It could have been a Socket to another
// machine, a database, an in memory array, etc.
new FileOutputStream(new File("o.ser")));
// do the magic
oos.writeObject( instance );
// close the writing.
oos.close();
}
}
import java.io.*;
导入java.util.*;
//这个类实现“Serializable”让系统知道
//这样做没关系。作为程序员,您知道这一点。
公共类SerializationSample实现可序列化{
//这些属性符合对象的“值”。
//这两个将被连载;
私有字符串aString=“该字符串的值”;
私有整数=0;
//但这不会发生,因为它被标记为瞬态。
私有临时列表无中断长列表;
//主要测试方法。
公共静态void main(字符串[]args)引发IOException{
//创建包含默认值的示例对象。
SerializationSample实例=新的SerializationSample();
//“ObjectOutputStream”类具有默认值
//用于序列化对象的定义。
ObjectOutputStream oos=新的ObjectOutputStream(
//通过使用“FileOutputStream”,我们将
//将其写入文件系统中的文件
//它可能是另一个插座
//计算机、数据库、内存阵列等。
新文件输出流(新文件(“o.ser”));
//施展魔法
oos.writeObject(实例);
//结束写作。
oos.close();
}
}
当我们运行这个程序时,文件“o.ser”被创建,我们可以看到后面发生了什么
如果我们将:someInteger的值更改为,例如Integer.MAX_value,我们可以比较输出以查看差异
下面是一个截图,正好显示了这种差异:
你能看出区别吗?;)
Java序列化中还有一个相关的字段:但是我想这已经太长了,无法涵盖它。序列化意味着在Java中持久化对象。如果您希望保存对象的状态并希望稍后重建状态(可能在另一个JVM中),可以使用序列化 请注意,只保存对象的属性。如果您想再次恢复对象,您应该拥有类文件,因为只存储成员变量,而不存储成员函数 例如:
Searializable是一个标记接口,它标记类是可序列化的。Marker接口意味着它只是一个空接口,使用该接口将通知JVM该类可以序列化。我喜欢@OscarRyz呈现的方式。尽管我在这里继续着最初由@amitgupta编写的文章 尽管了解机器人类结构并拥有序列化数据,但地球科学家无法对能够使机器人工作的数据进行反序列化
Exception in thread "main" java.io.InvalidClassException:
SerializeMe; local class incompatible: stream classdesc
:
火星的科学家们正在等待全部的付款。一旦支付完毕,火星的科学家们就与地球的科学家们分享了这笔钱。地球科学家将其设置为robot类,一切正常。序列化是将对象保存在存储介质(如文件或内存缓冲区)中或以二进制形式通过网络连接传输的过程。序列化对象独立于JVM,可以由任何JVM重新序列化。在这种情况下,“内存中”java对象状态被转换为字节流。用户无法理解这种类型的文件。它是一种特殊类型的对象,即被JVM(Java虚拟机)重用。序列化对象的过程也称为对对象进行压缩或编组 要序列化的对象必须实现
java.io.Serializable
接口。
对象的默认序列化机制写入对象的类、类签名和所有
Exception in thread "main" java.io.InvalidClassException:
SerializeMe; local class incompatible: stream classdesc
:
class ObjectOutputStream extends java.io.OutputStream implements ObjectOutput,
ObjectOutput ObjOut = new ObjectOutputStream(new FileOutputStream(f));
ObjectInputStream obj = new ObjectInputStream(new FileInputStream(f));
// ANY-ACCESS-MODIFIER static final long serialVersionUID = (64-bit has)L;
private static final long serialVersionUID = 3487495895819393L;
+--------------+--------+-------------------------------------+
| Flag Name | Value | Interpretation |
+--------------+--------+-------------------------------------+
| ACC_VOLATILE | 0x0040 | Declared volatile; cannot be cached.|
+--------------+--------+-------------------------------------+
|ACC_TRANSIENT | 0x0080 | Declared transient; not written or |
| | | read by a persistent object manager.|
+--------------+--------+-------------------------------------+
import java.io.*;
public class SerializeDemo
{
public static void main(String [] args)
{
Employee e = new Employee();
e.name = "Reyan Ali";
e.address = "Phokka Kuan, Ambehta Peer";
e.SSN = 11122333;
e.number = 101;
try
{
FileOutputStream fileOut =
new FileOutputStream("/tmp/employee.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(e);
out.close();
fileOut.close();
System.out.printf("Serialized data is saved in /tmp/employee.ser");
}catch(IOException i)
{
i.printStackTrace();
}
}
}
import java.io.*;
public class DeserializeDemo
{
public static void main(String [] args)
{
Employee e = null;
try
{
FileInputStream fileIn = new FileInputStream("/tmp/employee.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
e = (Employee) in.readObject();
in.close();
fileIn.close();
}catch(IOException i)
{
i.printStackTrace();
return;
}catch(ClassNotFoundException c)
{
System.out.println("Employee class not found");
c.printStackTrace();
return;
}
System.out.println("Deserialized Employee...");
System.out.println("Name: " + e.name);
System.out.println("Address: " + e.address);
System.out.println("SSN: " + e.SSN);
System.out.println("Number: " + e.number);
}
}
public class Item implements Serializable{
/**
* This is the Serializable class
*/
private static final long serialVersionUID = 475918891428093041L;
private Long itemId;
private String itemName;
private transient Double itemCostPrice;
public Item(Long itemId, String itemName, Double itemCostPrice) {
super();
this.itemId = itemId;
this.itemName = itemName;
this.itemCostPrice = itemCostPrice;
}
public Long getItemId() {
return itemId;
}
@Override
public String toString() {
return "Item [itemId=" + itemId + ", itemName=" + itemName + ", itemCostPrice=" + itemCostPrice + "]";
}
public void setItemId(Long itemId) {
this.itemId = itemId;
}
public String getItemName() {
return itemName;
}
public void setItemName(String itemName) {
this.itemName = itemName;
}
public Double getItemCostPrice() {
return itemCostPrice;
}
public void setItemCostPrice(Double itemCostPrice) {
this.itemCostPrice = itemCostPrice;
}
}
public class SerializationExample {
public static void main(String[] args){
serialize();
deserialize();
}
public static void serialize(){
Item item = new Item(1L,"Pen", 12.55);
System.out.println("Before Serialization" + item);
FileOutputStream fileOut;
try {
fileOut = new FileOutputStream("/tmp/item.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(item);
out.close();
fileOut.close();
System.out.println("Serialized data is saved in /tmp/item.ser");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void deserialize(){
Item item;
try {
FileInputStream fileIn = new FileInputStream("/tmp/item.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
item = (Item) in.readObject();
System.out.println("Serialized data is read from /tmp/item.ser");
System.out.println("After Deserialization" + item);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
Before SerializationItem [itemId=1, itemName=Pen, itemCostPrice=12.55]
Serialized data is saved in /tmp/item.ser
After DeserializationItem [itemId=1, itemName=Pen, itemCostPrice=null]
long hash = ((sha[0] >>> 24) & 0xFF) |
> ((sha[0] >>> 16) & 0xFF) << 8 |
> ((sha[0] >>> 8) & 0xFF) << 16 |
> ((sha[0] >>> 0) & 0xFF) << 24 |
> ((sha[1] >>> 24) & 0xFF) << 32 |
> ((sha[1] >>> 16) & 0xFF) << 40 |
> ((sha[1] >>> 8) & 0xFF) << 48 |
> ((sha[1] >>> 0) & 0xFF) << 56;
public class A implements Serializable{
String s;
static String staticString = "I won't be serializable";
}
public class A implements Serializable {....};
public class B extends A{...} //also Serializable
public class B{
String s,
A a; // class A needs to be serializable i.e. it must implement Serializable
}
class NamCls implements Serializable
{
int NumVar;
String NamVar;
}
class NamCls implements Serializable
{
int NumVar;
static String NamVar = "I won't be serializable";;
}
class NamCls implements Serializable
{
int NumVar;
transient String NamVar;
}