ObjectOutputStream

Status
Nicht offen für weitere Antworten.
U

USATourist

Gast
Hi

Benützt ihr oft den ObjectOutput/InputStream? Bzw. lohnt es sich und ist er gut?

Ich möchte ein kleines Vociprogramm schreiben, habe aber keine Lust Datenbanken zu verwenden. Ist der ObjectOutputStream langsam(er)?

Und inwiefern kann man jeweils einlesen? Also genauer: Wenn ich die Klasse etwas abändere, kann ich alte Files nicht mehr einlesen?
 
B

Beni

Gast
Ich benutz den ObjectOut/In nie. Der Nachteil: du speicherst mit hoher Wahrscheinlichkeit überflüssig viel, und ein anderes Programm wird deine Dateien garantiert nicht lesen können.

Ich benutz dafür DataOutput/InputStream, damit kann man auch sehr einfach Strings, Ints, ... speichern.
 

semi

Top Contributor
...oder die Methoden
Code:
private void writeObject(java.io.ObjectOutputStream out) throws IOException;
private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException;
implementieren und selbst bestimmen, wie die Objekte serialisiert werden.

Überlege Dir vielleicht ein eigenes Format für die Daten (mit Indizies etc.)
Macht zwar wenig Sinn aber man lernt viel dabei.
 

L-ectron-X

Gesperrter Benutzer
Objektserialisierung ist, wie ich finde, eine einfache und elegante Möglichkeit Daten in Form von Objektzuständen zu speichern. Andere Programme sind sehr wohl in der Lage, auch die serialisierten Daten einzulesen. Dafür ist es aber wichtig, dass die die gleiche serialVersionUID besitzen.
 
B

Beni

Gast
Na LeX, sag mal einem C++ -Programm, es soll ein serialisiertes Objekt laden. Ich wage zu behaupten, dass das nicht so einfach geht.
 

Sky

Top Contributor
Also ich denke, es kommt immer ganz genau darauf an, wofür man es braucht!!!
Wenn ich z.B. meine Daten wirklich nur für ein Programm brauche dann macht es sehr wohl Sinn den aktuellen Objektzustand zu speichern! Für den genannten Fall ist dies sogar ein sehr komfortabler Weg.

Btw.: Sollten sich die Anforderungen ändern, so muss sich dann ggfls. auch die Programmsourcen ändern. Wenn die Daten also auch anderweitig gebraucht werden kann man sich z.B. vorstellen, dass auch andere Speicher-Formate unterstützt werden oder auch, mittels eines kleinen Konverters einfach in ein anderes Format migriert werden.
 

thE_29

Top Contributor
Mh, in C++ muss man selber sagen was er serialisieren soll!

Geht irgendwie mit >> und << in einer Funktion!
 
M

mightymop

Gast
bin c++ programmierer und meinesachtens sind sie << und >> operatoren für bittverschiebungen zuständig
sofern sie nicht überladen wurden...


ich würde die ganze sache am besten mit xml machen... das ist universell und kann von anderen programmen gelesen werden, sofern eine xmlschnittstelle implementiert wurde und mit der DOM/SAX XML api ist das doch eigentlich ganz einfach ;)

mfg
 
M

mightymop

Gast
hm.. naja so gute hab ich net gefunden damals hab halt
n bisl gegoogelt... usw...

aber so könntest was machen:

Code:
import java.io.*;
import java.util.*;
import org.w3c.dom.*;
import javax.xml.parsers.*;


public class XmlDoc {
    public XmlDoc() {
        try {
            jbInit();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    Document doc = null;


    static public void main(String[] args) {
        XmlDoc XD = new XmlDoc();
        XD.doc = XD.neuesDoc();

        try {

            Element E = XD.doc.getDocumentElement();


            String dateiName = "Test.xml";
            FileOutputStream schreibeStrom =
                    new FileOutputStream(dateiName);

          String text;
          text = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>"+ E.toString();
            for (int i = 0; i < text.length(); i++) {
                schreibeStrom.write((byte) text.charAt(i));
            }
            schreibeStrom.close();

            readfile();

        } catch (Exception ex) {
        }
    }


    public static void readfile() {

        try {

            DocumentBuilderFactory DBF = DocumentBuilderFactory.newInstance();

            DBF.setValidating(false);
            DocumentBuilder DB = DBF.newDocumentBuilder();
            Document D = DB.parse(new File("Test.xml"));
            DBF.setNamespaceAware(true);

            Element E = D.getDocumentElement();         
           org.w3c.dom.NodeList te = E.getElementsByTagName("tag1");
           org.w3c.dom.Node b = te.item(0);

           System.out.println(b.getChildNodes().item(0).getChildNodes().item(0).toString());

        //müsste "inhaltvontag1" ausgeben...

        } catch (Exception e) {
           
        }
    }


      public Document neuesDoc() {
        DocumentBuilderFactory docBFac;
        DocumentBuilder docBuild;

        try {
            docBFac = DocumentBuilderFactory.newInstance();
            docBuild = docBFac.newDocumentBuilder();
            doc = docBuild.newDocument();

        } catch (Exception e) {
            System.out.println("Dokument konnte nicht erzeugt werden");
        }
        if (doc != null) {


            Element root = doc.createElement("xmldatei");

            Element tag= doc.createElement("tag1");
            tag.appendChild(doc.createTextNode("inhaltvontag1"));
            root.appendChild(tag);

             doc.appendChild(root);
        }
        return doc;
    }

    private void jbInit() throws Exception {
    }

}
 
M

mightymop

Gast
naja es kommt ja immer drauf an welche klasse/bibleothek man da verwendet...

bin jetzt mal von der STL ausgegangen... da wird << und >> von der klasse iostream verwendet um eingabe und ausgabe ströme zu lenken... aber es gibt jedoch einen unterschied beim speichern von dateien.. so kann man zwar mit hilfe von << in eine TEXTDATEI schreiben aber nich in eine binärdatei... blabla ich verlaber mich schon grad wieder *grml*

;)
 

thE_29

Top Contributor
Naja, es is aber egal was du verwendest, serialisiert wird immer mit << und >> in C++ :)

Aber hast recht, das ist der falsche Ort für das :)
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben