Hi Andreas,

Here you go:

<map>
<java version="1.6.0_06" class="java.beans.XMLDecoder">
 <object class="java.util.TreeMap">
  <void method="put">
   <string>KeyStr</string>
   <string>five</string>
  </void>
  <void method="put">
   <string>Test</string>
   <float>5.5</float>
  </void>
  <void method="put">
   <string>SomeKey</string>
   <int>5</int>
  </void>
  <void method="put">
   <string>nested</string>
   <object class="java.util.TreeMap">
    <void method="put">
     <string>me</string>
     <float>2.0</float>
    </void>
    <void method="put">
     <string>more</string>
     <int>100</int>
    </void>
    <void method="put">
     <string>moreNested</string>
     <object class="java.util.TreeMap">
      <void method="put">
       <string>String</string>
       <string>ten</string>
      </void>
     </object>
    </void>
   </object>
  </void>
 </object>
</java>
</map>

This is the serialization for a TreeMap having {<KeyStr, five>, <Test, 5.5>,
<someKey, 5>, <nested, {<me, 2.0>, <more, 100>, <moreNested, {<String,
ten>}>}>}

Regards,
Senaka

On Mon, Oct 27, 2008 at 1:52 AM, Andreas Veithen
<[EMAIL PROTECTED]>wrote:

> Senaka,
>
> Just a quick question: what does the serialization of a Map looks like
> with XMLEncoder?
>
> Andreas
>
> On Sat, Oct 25, 2008 at 20:01, Senaka Fernando <[EMAIL PROTECTED]>
> wrote:
> > Hi all,
> >
> > I'm working on a mechanism to attach a java.util.Map onto an Axiom Tree.
> So
> > far, I have been able to attach the java.util.Map onto the OM Tree with
> the
> > help of a specialized data source I have created. This implementation
> > features on-demand building of the XML payload and I believe the broader
> > usefulness of this would be to serve as a mechanism to store a
> java.util.Map
> > as a part of the OM Tree and perform XML operations (ex:- XPath) to
> extract
> > data if needed. However, there can be situations where one would require
> to
> > serialize the internal Map payload and obtain an XML representation. This
> > can be achieved either through a custom serializer or through a built-in
> > serializer that will convert the Map into an XML representation. I have
> as
> > of present added two serializers to the implementation.
> >
> > 1. A simple serializer i I wrote that can handle primitive types, and
> Maps
> > (supports hierarchical maps)
> > 2. The Java XML encoder/decoder for beans java.beans.XMLEncoder /
> > java.beans.XMLDecoder (Apache Harmony has an implementation of this if
> you
> > are interested in digging deeper into what happens, [1], [2])
> >
> > Now, after having a word with Paul on this setup I decided to make this
> > implementation more generic, and capable of supporting any type of object
> > attached to the Map, which eventually drops the 1st implementation above.
> > The second works fine, but, is a highly Java specific way of doing things
> > (but there is another point here, java.util.Map is Java anyway so this
> might
> > not be an issue) and make no sense in a non-Java context, and can also be
> > memory consuming and inefficient.
> >
> > I have investigated the possibility to make use of,
> >
> > 3. org.apache.axis2.databinding.utils.BeanUtil
> >  - This is a sample source code portion that i used,
> >
> >        XMLStreamReader xtr = BeanUtil.getPullParser(map);
> >        StAXOMBuilder builder = new StAXOMBuilder(xtr);
> >        OMElement ele = builder.getDocumentElement();
> >
> >   However, for some reason this doesn't work and I run into an NPE.
> >
> > org.apache.axiom.om.OMException: java.lang.NullPointerException
> >        at
> >
> org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:251)
> >        at
> >
> org.apache.axiom.om.impl.llom.OMDocumentImpl.getOMDocumentElement(OMDocumentImpl.java:132)
> >        at
> >
> org.apache.axiom.om.impl.builder.StAXOMBuilder.getDocumentElement(StAXOMBuilder.java:526)
> >        at my.package.MyClass.myMethod(MyClass.java:127)
> > Caused by: java.lang.NullPointerException
> >        at
> >
> org.apache.axiom.om.impl.builder.StAXOMBuilder.endElement(StAXOMBuilder.java:508)
> >        at
> >
> org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:222)
> >        ... 35 more
> >
> >   I spoke to Chinthaka on this matter, and was told that there might be
> an
> > assumption that the BeanUtil can only handle Bean Classes, or Classes
> that
> > are not Maps, which might have lead to this situation. I believe it wont
> be
> > easy to fix these issues. This is the rationale: I might be able to get
> this
> > to work for java.util.Map, but the whole idea is to make use of it to
> > serialize any type of object, where I can't anticipate the stability.
> >
> > 4. PayloadHelper in Apache Synapse
> >  This is a robust implementation that will work for primitive Maps (based
> > on org.apache.synapse.util.SimpleMap) like option 1. above. However, it
> > lacks some aspects.
> >    a. It is still a part of Synapse and needs to be ported to Axiom (this
> > is do-able as the system has clear and loosely coupled interfaces).
> >    b. It is an extension of HashMap and thus will not work with other Map
> > types, such as TreeMap which can be an issue when element ordering comes
> > into play.
> >    c. It wont support Hierarchical Maps (please correct me if I made a
> > mistake here).
> >    d. It still doesn't serve the purpose of supporting more generic Maps
> > with any types of objects in it.
> >
> > 5. A serialization/de-serialization mechanism found in Axis1 seems
> > interesting as well.
> >    - test/soap12/TestDeser.java, test/soap12/TestSer.java explains this
> > fact.
> >
> > In here, we have several advantages
> >    a. Uniform representation of any primitive type as well as complex
> types
> > as composites of primitive types
> >    b. Good performance
> >    c. Ability to nest
> >    d. Highly customizable
> >
> > But, there are disadvantages
> >    a. This scheme is not capable of storing information about the
> > underlying object unless it being explicitly told. Thus, unless we know
> what
> > is going on, the Vector class or an extension of a Vector class is
> > represented in the very same way. This is not the case in the java
> > serializer mechanism as object type information is automatically encoded.
> >    b. Assume that we came up with a modification to this scheme that
> makes
> > it possible to encode object types, still the implementor will have to
> > perhaps write his own Type Table for a type that we did not anticipate.
> >    c. Implementation can be complicated as the complexity of the types of
> > objects representable increases
> >    d. Additional maintenance overhead
> >
> > Therefore, each scheme seem to have pros and cons, and are not perfectly
> > fitting in. IMHO, the Java serializer might be the best scheme if we are
> to
> > consider a single scheme. However, modifications to a certain scheme to
> have
> > a combination of schemes to yield a useful result can prove to be
> > advantages. Also, I might have missed some other possibilities. Your
> input
> > is highly appreciated, and will serve as means for the approach I should
> be
> > taking.
> >
> > The current implementation is not as yet a part of Axiom and is available
> > at, [3]. The source includes a maven build system, and please note that
> if
> > you may run into some test failures due to an issue in the Axiom
> forceExpand
> > logic. I'm looking forward to have this fixed on the Axiom trunk.
> >
> > [1]
> >
> http://svn.apache.org/repos/asf/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/XMLEncoder.java
> > [2]
> >
> http://svn.apache.org/repos/asf/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/XMLDeccoder.java
> > [3] http://sci-flex.googlecode.com/svn/sci-flex/trunk/java/axiom
> >
> > Thanks,
> > Senaka
> >
>

Reply via email to