Soumen,
As I see it, as a user of Apache SOAP, you are a member of a community. You
have contributed by posting notice of a possible bug and pointing out what
you believe is an inefficiency in the implementation. You have a wonderful
chance to contribute further by reading the source yourself, confirming that
the bug is present, figuring out a good fix, and posting a patch to this
list so that others can benefit. Of course, that would require you somehow
find the time to do so and then make the product of your labor public for
inspection that will lead some to admire and respect you while others find
reason to ridicule you.
Anyway, in this case it seems clear that you are experiencing the effects of
a limitation of the implementation. The BeanSerializer does not maintain a
record of instances that have been serialized to allow it to href them in
later serializations. Therefore, any cyclic graph should, I believe, cause
infinite recursion.
Scott
----- Original Message -----
From: "Soumen Sarkar" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Thursday, July 12, 2001 7:00 PM
Subject: RE: Bugs in Soap 2.2 BeanSerializer?
> How sad.. that nobody in Apache Soap Development community has the GUTS to
> acknowledge that either it is a bug or not a bug in Soap 2.2
BeanSerializer.
> Why should
> Soap 2.2 BeanSerialize run out of stack depth if class Employee contains a
> field 'subordinates'
> of type Employee[] or Vector of Employee?
>
> What purpose [EMAIL PROTECTED] serves if I am not able to get answer
> to this technical question from
> so called experts?
>
> Could anybody please suggest suitable forums where I may post technical
> question such as this regarding
> APACHE SOAP 2.2?
>
> Thanks in advance to anybody kind enough to reply.
>
> Regards,
> Soumen.
>
> > -----Original Message-----
> > From: Soumen Sarkar
> > Sent: Monday, July 09, 2001 11:11 AM
> > To: '[EMAIL PROTECTED]'
> > Subject: Bugs in Soap 2.2 BeanSerializer?
> >
> > Hi,
> >
> > I tried to exchange the following data structure over SOAP by using SOAP
> > 2.2 Bean Serializer class
> > public class Employee implements Serializable
> > {
> > // not null
> > public String name;
> > // null if no manager
> > public Employee manager;
> > // null if no subordinates,this is a Employee Vector
> > public Vector subordinates;
> > }
> > It runs into the following serialization problem:
> > <stackTrace>
> > <detail>
> > java.lang.StackOverflowError
> > at java.lang.Class.toString(Class.java:82)
> > at java.lang.String.valueOf(String.java:1925)
> > at
> >
org.apache.soap.util.xml.XMLJavaMappingRegistry.getKey(XMLJavaMappingRegis
> > try.java:265)
> > at
> >
org.apache.soap.util.xml.XMLJavaMappingRegistry.queryElementType(XMLJavaMa
> > ppingRegistry.java:192)
> > at
> >
org.apache.soap.encoding.SOAPMappingRegistry.queryElementType(SOAPMappingR
> > egistry.java:460)
> > at
> >
org.apache.soap.encoding.soapenc.SoapEncUtils.generateStructureHeader(Soap
> > EncUtils.java:129)
> > at
> >
org.apache.soap.encoding.soapenc.SoapEncUtils.generateStructureHeader(Soap
> > EncUtils.java:116)
> > at
> >
org.apache.soap.encoding.soapenc.BeanSerializer.marshall(BeanSerializer.ja
> > va:86)
> > at
> >
org.apache.soap.util.xml.XMLJavaMappingRegistry.marshall(XMLJavaMappingReg
> > istry.java:238)
> > at
> >
org.apache.soap.encoding.soapenc.ArraySerializer.marshall(ArraySerializer.
> > java:133)
> > ......
> > ......
> > ......
> > at
> >
org.apache.soap.encoding.soapenc.BeanSerializer.marshall(BeanSerializer.ja
> > va:131)
> > </stackTrace>
> > </detail>
> > </SOAP-ENV:Fault>
> >
> > Basically I found out that SOAP 2.2 BeanSerializer can not handle
Employee
> > class having
> > subordinate field as a Vector of Employee (or Employee[]). When I
shanged
> > subordinates field
> > to Vector of String (or String[]) there was no StackOverflow problem.
> > There is no problem in
> > exchanging this data structure over EJB (i.e Java RMI). I also found out
> > that SOAP 2.2 XML
> > serialization does not implement reference semantics as it is done in
> > basic Java/RMI serialization.
> > What this means is that XML messages tend to be very large in situations
> > where Employee contains
> > reference to another Employee(i.e manager). What SOAP 2.2 BeanSerializer
> > does is to LITERALLY
> > INCLUDE ALL DETAILS OF MANAGER in EACH SUBORDINATE OF THAT MANAGER.
> > This is very naive implementation and will cause very large XML
messages.
> > XML permits ID, IDERF,
> > why not use that? Why to literally REPEAT Manager details in each
> > Employee?
> >
> > Can somebody from SOAP development team confirm that these are indeed
> > BeanSerializer bug/shortcomings?
> > I am attaching complete Employee class below.
> >
> > Regards,
> > Soumen Sarkar
> >
> > Atoga Systems Inc. (http://www.atoga.com)
> > 510-743-0254
> >
> > Employee class
> > ------------------------
> > //Writing Employee as an ideal bean by providing get and set methods
> > package AnotherEmployeeSLBean;
> > import java.io.*;
> > import java.util.*;
> > public class Employee implements Serializable
> > {
> > // not null
> > public String name;
> > // null if no manager
> > public Employee manager;
> > // null if no subordinates,this is a Employee Vector
> > public Vector subordinates;
> > // not null
> > public String ssn;
> > public double salary;
> > // null if no dependents
> > public Dependent[] dependents;
> > public Employee()
> > { }
> > public Employee(String name,Employee manager,Employee[]
> > subordinates,String ssn,double salary,Dependent[] dependents)
> > { this.name = name;
> > this.manager = manager;
> > this.subordinates = subordinates;
> > this.ssn = ssn;
> > this.salary = salary;
> > this.dependents = dependents;
> > }
> > public String getName() { return name; }
> > public void setName(String name) { this.name = name; }
> > public Employee getManager() { return manager; }
> > public void setManager(Employee manager) { this.manager = manager; }
> > public Vector getSubordinates() { return subordinates; }
> > public void setSubordinates(Vector subordinates) { this.subordinates =
> > subordinates; }
> > public String getSsn() { return ssn; }
> > public void setSsn(String ssn) { this.ssn = ssn; }
> > public double getSalary() { return salary; }
> > public void setSalary(double salary) { this.salary = salary; }
> > public Dependent[] getDependents() { return dependents; }
> > public void setDependents(Dependent[] dependents) { this.dependents =
> > dependents; }
> > public String toString()
> > { String retVal = "Employee" + "\n"; retVal += "{" + "\n";
> > retVal += "name = " + name + "\n";
> > retVal += "ssn = " + ssn + "\n";
> > retVal += "salary = " + salary + "\n";
> > retVal += "manager = " + manager + "\n";
> > if(subordinates!= null)
> > { retVal += "Subordinates are:";
> > for(int i = 0; i < subordinates.size(); ++i)
> > { retVal += subordinates.elementAt(i)+ "\n"; }
> > }
> > if(dependents!= null)
> > { retVal += "Dependents are:";
> > for(int i = 0; i < dependents.length; ++i) { retVal += dependents[i]+
> > "\n"; }
> > }
> > retVal += "}" + "\n"; return retVal;
> > }
> > }
> > //Writing Dependent as an ideal bean by providing get and set methods
> > package AnotherEmployeeSLBean;
> > import java.io.*;
> > public class Dependent implements Serializable
> > {
> > public String name;
> > public int age;
> > public String relationship;
> > public Dependent(String name,int age,String relationship)
> > { this.name = name; this.age = age; this.relationship = relationship; }
> > public Dependent() { }
> > public String getName() { return name; }
> > public void setName(String name) { this.name = name; }
> > public int getAge() { return age; }
> > public void setAge(int age) { this.age = age; }
> > public String getRelationship() { return relationship; }
> > public void setRelationship(String relationship) { this.relationship =
> > relationship; }
> > public String toString()
> > { String retVal = "Dependent" + "\n";
> > retVal += "{" + "\n";
> > retVal += "name = " + name + "\n";
> > retVal += "age = " + age + "\n";
> > retVal += "relationship = " + relationship + "\n";
> > retVal += "}" + "\n"; return retVal;
> > }
> > }