第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會有你想問的

ArrayList 上的可序列化丟失一些數(shù)據(jù)

ArrayList 上的可序列化丟失一些數(shù)據(jù)

楊魅力 2022-07-27 20:38:24
我有一個(gè) Employee 對象的 ArrayList,其中 Employee 類實(shí)現(xiàn)了 Serializable。我正在使用此代碼將列表寫入文件:ArrayList<Employee> empList = new ArrayList<>();  FileOutputStream fos = new FileOutputStream("EmpObject.ser");  ObjectOutputStream oos = new ObjectOutputStream(fos);  // write object to file  empList .add(emp1);  empList .add(emp2);  oos.writeObject(empList);  empList .add(emp3);  oos.writeObject(empList);}如果我嘗試反序列化它,我只會得到前兩個(gè)對象而不是第三個(gè)對象。任何人都可以試試這是為什么?編輯1:如果我一次添加所有元素,一切都很好,但不是我第一次做的方式。有什么區(qū)別?ArrayList<Employee> empList = new ArrayList<>();  FileOutputStream fos = new FileOutputStream("EmpObject.ser");  ObjectOutputStream oos = new ObjectOutputStream(fos);  // write object to file  empList .add(emp1);  empList .add(emp2);  empList .add(emp3);  oos.writeObject(empList);}在此之后我有 3 個(gè)元素
查看完整描述

3 回答

?
炎炎設(shè)計(jì)

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í)例的引用)


查看完整回答
反對 回復(fù) 2022-07-27
?
Helenr

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

    }

}


查看完整回答
反對 回復(fù) 2022-07-27
?
慕哥9229398

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ā)生變化,它也不會再次寫入。


查看完整回答
反對 回復(fù) 2022-07-27
  • 3 回答
  • 0 關(guān)注
  • 235 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號