For a binary file, use a string element and return it base64 encoded. Although Java has no built in function to do base 64 encoding/decoding, it is easy enough to achieve. That way you will not need to worry about serialization issues. For Java, PHP, Python, etc.
If the binary file will ever be very large, (into the megabyte range) you may want to return it as a soap attachment. (DIME or MTOM) Sometimes a client will have XML Denial of Service prevention measures in effect (I can think of several network appliances that do this) and will try to load the entire message into a buffer to parse. If the buffer is not big enough, you lose the message. Sending a large base64 encoded binary as an attachment avoids this.
Last, .Net will let you create a target namespace that a Java client can't handle. This will cause problems. Make sure the namespace meets the standards.