webForumDet fria alternativet

Spara obeject på fil!

11 svar · 308 visningar · startad av niels

nielsMedlem sedan juli 2000212 inlägg
#1

Sitter och försöker spara ett object på fil! Object är en AccountCollection som har ärvt ev Vector. Ett Account object är uppbyggt på har både object som attribut och subklasser. Jag har satt alla klasser(som är med i hierarkin i AccountCollection) att implementera Serializable. Följande kod använder jag för att läsa in resp. ut:

public void readAccounts(String file) {
		
		try {
			FileInputStream istream = new FileInputStream(file);
			ObjectInputStream p = new ObjectInputStream(istream);
			
			accCollection = (AccountCollection)p.readObject();
			
			istream.close();
		} catch(Exception e) {
			; 		}
		
	}
	
	public void writeAccounts(String file) {
		
		try {
			FileOutputStream ostream = new FileOutputStream(file);
			ObjectOutputStream p = new ObjectOutputStream(ostream);
			
			p.writeObject(accCollection);
			
			p.flush();
			ostream.close();
		} catch(Exception e) {
			; 		}
	
	}

(ligger i AccountCollection)

men inte fan fungerar detta! Vad har jag gjort för fel??

/Niels

phonkworksMedlem sedan juli 2001228 inlägg
#2

Kompilerar det?
Vad får du för stackTrace?

Hur har du deklarerat accCollection?
Vector accCollection;
eller
AccountCollection accCollection;

mvh
phonk

nielsMedlem sedan juli 2000212 inlägg
#3

Joru...

Jodå det kompilerar finnt men det fungerar ändå inte!

Man måste ange att klasserna som är med är Serializable va??

Jag har deklareas som:
AccountCollection accCollection;

nielsMedlem sedan juli 2000212 inlägg
#4

När jag läser in objectet ifrån filen igen så finns inga Accounts med i AccountCollection objektet!

phonkworksMedlem sedan juli 2001228 inlägg
#5

Så det går bra att skriva och läsa objektet men de Accounts som du har "settat" innan finns inte med sen när du läst tillbaka objektet... hm... det känns som inte allt som Account innehåller går att serialisera.... men det säger ju du att du har implementerat överallt... så näe, jag går bet .. nån annan??

phonkworksMedlem sedan juli 2001228 inlägg
#6

Bara en tanke:
Hur konstruerar du AccountCollection?
Så här antar jag:

...
private AccountCollection accCollection;
public AccountCollection() { accCollection = this; }
...
nielsMedlem sedan juli 2000212 inlägg
#7

import java.util.Vector;
import java.util.Iterator;
import java.io.*;

public class AccountCollection extends Vector implements Serializable {
	
	Vector accCollection;
	
	public AccountCollection() {
		accCollection = new Vector();
	}
	
	public void addAccount(Account acc) {
		addElement(acc);
	}
	
	public void removeAccount(Account acc) {
		removeElement(acc);
	}
	
	public Account getAccount(int accNr) {
		return (Account) elementAt(accNr - 1);
   }

	public String toString() {
		String result = "";
		Iterator iter = iterator();
		while(iter.hasNext()) {
			Account acc = (Account) iter.next();
			result += acc.getAccountID() + '\t' + acc.getBalance() + '\t'
				+ acc.getInterest() + '\t';
			result += (acc instanceof SalaryAccount ? "Salary Account" : "Savings Account");
			result += '\n'; 
		}
		return result;
	}
	
	public void readAccounts(String file) {
		
		try {
			FileInputStream istream = new FileInputStream(file);
			ObjectInputStream p = new ObjectInputStream(istream);
			
			accCollection = (AccountCollection)p.readObject();
			
			istream.close();
		} catch(Exception e) {
			; //Error handling not needed for program functionallity.
		}
		
	}
	
	public void writeAccounts(String file) {
		
		try {
			FileOutputStream ostream = new FileOutputStream(file);
			ObjectOutputStream p = new ObjectOutputStream(ostream);
			
			p.writeObject(accCollection);
			
			p.flush();
			ostream.close();
		} catch(Exception e) {
			; //Error handling not needed for program functionallity.	
		}
	
	}

}

...

import java.io.*;

public class Bank {
	
	private static final String DB_PATH = "accounts.dat"; 
	private AccountCollection accountDB 
	
	public static void main(String[] args) {
		accountDB = new AccountCollection();
		accountDB.readAccounts(DB_PATH);

		//...
		
		
		accountDB.writeAccounts(DB_PATH);
	}
		
}
nielsMedlem sedan juli 2000212 inlägg
#8

Gärna elaka kommentare om koden ovan! Håller på att lära mig java, lika bra att lära sig ordentligt när man ändå håller på!

phonkworksMedlem sedan juli 2001228 inlägg
#9

Aha!

Jo, eftersom du skriver:
accCollection = new Vector();
så kommer den object variabeln att peka på ett helt annat objekt och leva sitt eget liv, mao inte reagera på några av metoderna.

Din klass är ju den Vector du vill manipulera så skriv:
accCollection = this;
i konstruktorn istället så refererar den till sig själv.

Det borde lira...

mvh
phonk

phonkworksMedlem sedan juli 2001228 inlägg
#10

Såg ett till problem:

När du läser in en ny Vector från filen kommer även denna gång accCollection peka på ett annat objekt och inte sig själv längre så gör så här:


	public void readAccounts(String file, boolean append) {
		
		try {
			FileInputStream istream = new FileInputStream(file);
			ObjectInputStream p = new ObjectInputStream(istream);
			if(!append) removeAllElements();
			addAll( (AcountCollection) p.readObject());
			
			istream.close();
		} catch(Exception e) {
			; //Error handling not needed for program functionallity.
		}
		
	}

Och när vi ändå är igång så skippa accCollection variabeln helt o hållet och gör om skriv metoden så här:

	public void writeAccounts(String file) {
		
		try {
			FileOutputStream ostream = new FileOutputStream(file);
			ObjectOutputStream p = new ObjectOutputStream(ostream);
			
			p.writeObject(this); // this!!!!!!!!
			
			p.flush();
			ostream.close();
		} catch(Exception e) {
			; //Error handling not needed for program functionallity.	
		}
	
	}
nielsMedlem sedan juli 2000212 inlägg
#11

Nu funka det fin fint! Heder till dig phonkworks! :bire

phonkworksMedlem sedan juli 2001228 inlägg
#12

Härligt!

Tack!

135 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)