3 回答

TA貢獻(xiàn)1808條經(jīng)驗(yàn) 獲得超4個(gè)贊
基本上ObjectOutputStream
記住寫入它的對象。如果再次寫入相同的對象(通過引用),它不會被序列化,而是對先前序列化數(shù)據(jù)的引用被寫入流。reset()
方法清理內(nèi)部數(shù)據(jù)結(jié)構(gòu)ObjectOutputStream
并允許您再次編寫相同的對象。reset()
不會丟棄已寫入流的數(shù)據(jù)。
如果您嘗試將流反序列化為兩個(gè) ArrayList,您將得到一個(gè)包含兩個(gè)元素和一個(gè)包含三個(gè)元素。
如果您刪除對reset()
方法的調(diào)用,那么您將獲得兩個(gè)包含兩個(gè)元素的數(shù)組列表(一個(gè)實(shí)際序列化,另一個(gè)作為對先前序列化實(shí)例的引用)

TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超4個(gè)贊
正如 GhostCat 和 uaraven 已經(jīng)提到的那樣,reset 并不是你期望的那樣,你應(yīng)該看看關(guān)于序列化的教程,也許考慮使用 sth。否則,如果這不適合您的用例。
如果創(chuàng)建一個(gè)新的 FileOutputStream,您的代碼可能如下所示:
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class SerializationTest {
public static void main(String[] args) throws IOException, ClassNotFoundException {
String path = "EmpObject.ser";
ArrayList<Employee> empList = new ArrayList<>();
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(path));
empList.add(emp1);
empList.add(emp2);
oos.writeObject(empList);
empList.add(emp3);
// Create a new FileOutputStream to override the files content instead of appending the new employee list
oos = new ObjectOutputStream( new FileOutputStream(path));
oos.writeObject(empList);
ObjectInputStream objectinputstream = new ObjectInputStream(new FileInputStream(path));
List<Employee> readCase = (List<Employee>) objectinputstream.readObject();
System.out.println(readCase);
}
}

TA貢獻(xiàn)1877條經(jīng)驗(yàn) 獲得超6個(gè)贊
您的代碼會發(fā)生什么:
您將列表寫入文件,其中包含兩個(gè)條目
你重置了流
你再寫一次清單,三個(gè)條目
因此,您的文件包含兩個(gè)值,是的。兩個(gè)列表,一個(gè)有 2 個(gè),一個(gè)有 3 個(gè)條目。
換句話說:reset()
不會重置已寫入文件的內(nèi)容!你寫了一個(gè)包含兩個(gè)條目的列表。您只是重置有關(guān)存儲對象的信息,以便 emp1 和 emp2再次完全序列化。如果不調(diào)用 reset,JVM 就會明白它不需要再次完全序列化 emp1 和 emp2。
含義:默認(rèn)情況下,JVM 會壓縮要傳輸?shù)臄?shù)據(jù)量。它會記住哪些對象已經(jīng)寫入,而不是重復(fù)寫入它們,它只會將“之前序列化的對象 X 再次出現(xiàn)”之類的內(nèi)容寫入流中。
所以:我認(rèn)為您根本不了解該reset()
方法的要點(diǎn)。解決方案:閱讀一個(gè)小教程,比如來自tutorialspoint的教程。
根據(jù) OP 的最新評論進(jìn)行編輯:
你要求的東西是不可能的。您正在編寫列表對象。這意味著此時(shí)該列表的所有條目都會寫入文件。JVM 會記住“該列表已被寫入”,因此即使其內(nèi)部狀態(tài)同時(shí)發(fā)生變化,它也不會再次寫入。
添加回答
舉報(bào)