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.
Thanks, 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 (http://java.sun.com/products/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 used? 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 Framework? 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) iter.next(); 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); } }
Interoperability Notes on Apache Axis 1.1 Beta and Microsoft .NET Framework 1.0 FAQ Last Updated: Feb-06-2003 Author: Rick Kellogg ([EMAIL PROTECTED]) 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 (http://java.sun.com/products/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 used? 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 Framework? 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) iter.next(); 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); } }
