001: // You can redistribute this software and/or modify it under the terms of
002: // the Ozone Library License version 1 published by ozone-db.org.
003: //
004: // The original code and portions created by SMB are
005: // Copyright (C) 1997-@year@ by SMB GmbH. All rights reserved.
006: //
007: // $Id: DxObjectOutputStream.java,v 1.1 2001/12/18 10:31:30 per_nyfelt Exp $
008:
009: package org.ozoneDB.DxLib;
010:
011: import java.io.*;
012: import java.util.*;
013:
014: /**
015: * Dieser Stream ist ein Ersatz fuer den Java-ObjectOutputStream. In gewissen
016: * Situationen ist er weniger speicherintensiv. Es koennen allerdings nur
017: * Objekte geschrieben werden, die das Externalizable-Interface implementieren.
018: *
019: *
020: * @author <a href="http://www.softwarebuero.de/">SMB</a>
021: * @version $Revision: 1.1 $Date: 2001/12/18 10:31:30 $
022: */
023: public class DxObjectOutputStream extends DataOutputStream implements
024: ObjectOutput {
025: protected Hashtable table;
026: protected Hashtable classes;
027:
028: public DxObjectOutputStream(OutputStream out) {
029: super (new BufferedOutputStream(out, 4096));
030: table = new Hashtable();
031: classes = new Hashtable();
032: }
033:
034: public DxObjectOutputStream(OutputStream out, int bufferSize) {
035: super (new BufferedOutputStream(out, bufferSize));
036: table = new Hashtable();
037: classes = new Hashtable();
038: }
039:
040: public void reset() throws IOException {
041: table.clear();
042: classes.clear();
043: flush();
044: //System.out.println ("ObjOutputStream.reset()");
045: }
046:
047: protected void writeClassName(Object obj) throws IOException {
048: String cName = obj.getClass().getName();
049: Integer index = (Integer) classes.get(cName);
050: if (index == null) {
051: //neuer Klassenname
052: writeUTF(cName);
053: classes.put(cName, new Integer(classes.size()));
054: } else {
055: // Klassenname schon geschrieben
056: writeUTF("+");
057: writeShort(index.intValue());
058: }
059: }
060:
061: public void writeObject(Object obj) throws IOException {
062: try {
063: // falls obj nicht init., wird beim lesen wieder mit null init.
064: if (obj == null) {
065: writeUTF("_");
066: //System.out.println ("writeObject(): null ");
067: return;
068: }
069:
070: if (!(obj instanceof Externalizable)) {
071: throw new IOException("Class "
072: + obj.getClass().getName()
073: + " doesn't implement Externalizable");
074: }
075:
076: Integer hc = new Integer(System.identityHashCode(obj));
077: if (!table.containsKey(hc)) {
078: // erst registrieren, sonst endlos-rekursion
079: table.put(hc, obj);
080: // klassennamen speichern
081: writeClassName(obj);
082: //System.out.println ("writeObject(): hashcode " + hc);
083: // hashCode als objID speichern
084: writeInt(hc.intValue());
085: // objekt selbst speichern
086: ((Externalizable) obj).writeExternal(this );
087: } else {
088: // obj schon gespeichert
089: writeUTF(">");
090: // hashCode als objID speichern
091: writeInt(hc.intValue());
092: //System.out.println ("writeObject(): hashCode ref " + hc);
093: }
094: } catch (IOException e) {
095: throw e;
096: } catch (Exception e) {
097: throw new IOException(e.toString());
098: }
099: }
100: }
|