Hi Richard! Thanks for the great work. Some comments below:
> 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. I'm not sure what you mean here. The Java wrapper classes work fine, they'll just be converted on the wire to their XML equivalents (either SOAP-ENC:int or xsd:int, for instance).... > Q: What datatypes or design patterns should I avoid when > seeking maximum interoperability? > A: You should avoid the following constructs: > * Standard Java Collection classes. Why? Java Collections serialize to/from SOAP arrays. > * Typesafe enumerations. Use static final variables > within Java instead. You should give an example here. > * Multi-dimensional and jagged arrays. Multi-dimensional arrays work fine AFAIK. > * 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. This would be better phrased "is there built-in support for...". People are of course welcome to write an Axis Handler and a .NET thingy ("filter"?) to do it themselves. > 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); > } > } > >
