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;
}