Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsWhite Papers
Discussion GroupsFirst AidDatabasesJavaBeansGUIJava 3DVirtual MachineCORBASecurityToolsGeneral
Java DirectoryOpen Source ProjectsSample Book ChaptersUser GroupsWeb Resources
Related Topics
Databases.NETMore Topics ...

Java Forum / General / April 2007

Tip: Looking for answers? Try searching our database.

XML Encoder Serialization

Thread view: 
Adam.Holmberg@gmail.com - 07 Apr 2007 21:59 GMT
Greetings.
I'm working on a design in which I had hoped to use XMLEncoder to
store objects to disk. While testing it on two of my classes, I
observed an inconsistency in which fields get added to the XML
document. I use code like the following to write them out:

<o gets declared/initialized>
String f = "c:\\tmp\\packet.xml";
XMLEncoder out = new XMLEncoder(new BufferedOutputStream(new
FileOutputStream(f)));
out.writeObject(o);
out.close();

When I create a class from scratch, this appears to write out every
member of o for which there is a getter and setter defined. However, I
tried doing it to two of my existing classes with varying results. The
class HBitField (see below) worked as expected, with all four member
fields being written to XML. Unfortunately HPacketEntry (below) only
prints the "name" and "numWords" fields -- omitting "wordSize" and
"bitFields". I have accessors defined for all of them, and the
protection level is the same. Why are these classes being treated
differently by the Encoder? Is there some caveat I'm missing here?

Any insight would be greatly appreciated.

#########################
HBitField
#########################
public class HBitField {

    protected int FirstWord;

    protected int StartBit;

    protected int Length;

    protected String Name;

    public HBitField() {
        super();
        FirstWord = 0;
        StartBit = 0;
        Length = 0;
        this.setName("");
    }
...
<other ctors, methods>
...

    public String getName() {
        return Name;
    }

    public void setName(String name) {
        Name = name;
    }

    public int getFirstWord() {
        return FirstWord;
    }

    public void setFirstWord(int firstWord) {
        FirstWord = firstWord;
    }

    public int getLength() {
        return Length;
    }

    public void setLength(int length) {
        Length = length;
    }

    public int getStartBit() {
        return StartBit;
    }

    public void setStartBit(int startBit) {
        StartBit = startBit;
    }
}

#########################
HPacketEntry
#########################
public class HPacketEntry {

    protected int wordSize;
    protected int numWords;
    protected String name;

    private HashSet bitFields;

    public HPacketEntry() {
        this.wordSize = 16;
        this.numWords = 1;
        this.bitFields = new HashSet();
        this.name = new String("default");
    }
...
<other ctors, methods>
...
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getWordSize() {
        return wordSize;
    }

    public void setWordSize(int wordSize) {
        this.wordSize = wordSize;
    }

    public HashSet getBitFields() {
        return bitFields;
    }

    public void setBitFields(HashSet bitFields) {
        this.bitFields = bitFields;
    }

    public int getNumWords() {
        return numWords;
    }

    public void setNumWords(int numWords) {
        this.numWords = numWords;
    }
}
CodeForTea@gmail.com - 08 Apr 2007 02:04 GMT
On Apr 7, 4:59 pm, Adam.Holmb...@gmail.com wrote:
> Greetings.
> I'm working on a design in which I had hoped to use XMLEncoder to
[quoted text clipped - 134 lines]
>
> - Show quoted text -

I may have an answer to your problem.  I was reading the documention
on XMLEncoder
http://java.sun.com/j2se/1.4.2/docs/api/java/beans/XMLEncoder.html#writeObject(j
ava.lang.Object
)
and saw that
The XML documents produced by the XMLEncoder class are Structurally
compact: The XMLEncoder class uses a redundancy elimination algorithm
internally so that the default values of a Bean's properties are not
written to the stream.
So I changed the default values  of your class
       HPacketEntry packetEntry = new HPacketEntry();
       packetEntry.setName("Joe");
       packetEntry.setNumWords(20);
       packetEntry.setWordSize(50);
       XMLEncoder e = new XMLEncoder(
               new BufferedOutputStream(
                   new FileOutputStream("Test.xml")));

           e.writeObject(packetEntry);
           e.close();
and i got the follwing result
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.5.0_03" class="java.beans.XMLDecoder">
<object class="HPacketEntry">
 <void property="name">
  <string>Joe</string>
 </void>
 <void property="numWords">
  <int>20</int>
 </void>
 <void property="wordSize">
  <int>50</int>
 </void>
</object>
</java>

Dinesh
aholmber - 08 Apr 2007 23:03 GMT
Dinesh,

Thanks for pointing that out. That was definitely an oversight on my
part. I was actually using a non-default constrcutor, but passing it
parameters that matched the values in the default constructor. The
encoder was still able to determine that they were default values.

Interesting class.

Thanks again for pointing that out!

Adam
Jeffrey H. Coffield - 08 Apr 2007 21:08 GMT
> Greetings.
> I'm working on a design in which I had hoped to use XMLEncoder to
> store objects to disk. While testing it on two of my classes, I
> observed an inconsistency in which fields get added to the XML
> document. I use code like the following to write them out:

XML will only work as long as the classes themselves do not change. I
finally abandoned XML for storage because new versions of the classes in
many cases could not load the old data.

Jeff Coffield
aholmber - 08 Apr 2007 23:04 GMT
On Apr 8, 1:08 pm, "Jeffrey H. Coffield"
<jeff...@digitalsynergyinc.com> wrote:
> Adam.Holmb...@gmail.com wrote:
> > Greetings.
[quoted text clipped - 8 lines]
>
> Jeff Coffield

Thanks for the tip.


Free Magazines

Get these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.