axis-java-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Kellogg, Richard" <RKell...@MICROS.COM>
Subject Revised Interoperability between Axis 1.1 Beta and Microsoft .NET Framework 1.0 FAQ
Date Thu, 06 Feb 2003 13:57:56 GMT
Well gang.  I have added a few new details and added comments provided by Steve.  If you have
anything to add please send it on.
If this looks complete I will try and submit it as a HTML document for addition to CVS.

Rick Kellogg

Interoperability Notes on Apache Axis 1.1 Beta and Microsoft .NET Framework 1.0 FAQ
Last Updated: Feb-06-2003

Q: What datatypes can be safely used between Java and the Microsoft .NET 1.0 Framework?
A: The following simple Java datatypes can be used: String, boolean, byte, short, int, long,
float, and double.
   You can also create typed arrays of any of the above.  Standard Sun JavaBeans (
and arrays
   of JavaBeans are supported as well.

Q: What about transferring java.util.Calendar values?
A: There are known problems with serializing/deserializing Calendar objects.  Under Java,
the Calendar object includes timezone
   information.  Under .NET, the System.DateTime value object does not contain timezone information.
 The .NET Framework assumes its
   timezone is the current timezone when serializing and ignores it when deserializing.  As
a result, values can be off by +/- 24 hours.

   Two possible work arounds are the use of a string or wrapper value object.  When transmitting
time values, a long is recommended.

Q: Can you provide mappings for Java datatypes to their equivalents under .NET?
A: Java	      C#.NET     VB.NET      .NET Framework Type
   String     string     String      System.String
   boolean    bool       Boolean     System.Boolean
   byte	      sbyte      -N/A-       System.SByte
   short      short      Decimal     System.Int16
   int 	      int        Integer     System.Int32
   long       long       Long        System.Int64
   float      float      Single      System.Single
   double     double     Double      System.Double

Q: Can the standard Java primitive wrappers like java.lang.Integer or java.lang.Double be
A: Not directly.  Microsoft C# does not have an equivalent language feature.  You could work
around this by using the C# object datatype.

Q: What datatypes or design patterns should I avoid when seeking maximum interoperability?
A: You should avoid the following constructs:
      * Standard Java Collection classes.
      * Typesafe enumerations.  Use static final variables within Java instead.
      * Multi-dimensional and jagged arrays.
      * The Java char datatype is not supported because of an omission in XML Schema.
      * Avoid using the same method name multiple times with varying parameters on a web service.

Q: How does one go about transmitting attachments between Java and the Microsoft .NET 1.0
A: The basic .NET Framework 1.0 does not provide any support for attachments.

   The recent Microsoft Web Services Enhancements (WSE) 1.0 does add support for DIME (Direct
Internet Message Encapsulation).
   Please note there has been no indication from Microsoft concerning whether WSE will be
included in the upcoming .NET Framework 1.1.
   As a result, DIME support would require the installation on WSE on client machines.

   Axis does support both MIME and DIME attachments.

Q: Is it possible to compress a message using something like GZIP?
A: Unfortunately at this time no.

Q: Can you provide a recommendation of how to transport a java.util.Map to C#?
A: The easiest solution is to implement a typed array with a JavaBean.

   public class MapEntryVO {
     private Object  key;
     private Object  value;

     public MapEntryVO() {

     public MapEntryVO(String key, Object value) {
       this.key   = key;
       this.value = value;

     public Object getKey() {
       return key;
     public void setKey(Object value) {
       key = value;

     public Object getValue() {
       return value;
     public void setValue(Object value) {
       this.value = value;


   import java.util.*;

   public class WebServicesUtils {
     public static MapEntryVO[] convertMapToMapEntryVO(Map conv) {
       MapEntryVO[] result = new MapEntryVO[conv.size()];
       int i = 0;
       Iterator iter = conv.entrySet().iterator();

       while (iter.hasNext()) {
         Map.Entry item = (Map.Entry);
         result[i++] = new MapEntryVO(item.getKey(),item.getValue());

       return result;


   // Example WebService
   public class TestService {
      public MapEntryVO[] testMethod() {
        java.util.Map value = new java.util.HashMap();

        value.put("Key 1","Value 1");
        value.put("Key 2","Value 2");

        return WebServicesUtils.convertMapToMapEntryVO(value);

View raw message