 <p>Java's <code>outputstream</code> can not do what you want either, all it can do is send <code>byte[]</code> which is exactly what C#'s socket classes do.</p> <p>If you want to send complex objects you must use some form of "Serializer" which will let you transform your objects in to a <code>byte[]</code> to be sent out.</p> <p>A easy to use serializer that is built in to .NET is <a href="https://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer(v=vs.110).aspx" rel="nofollow"><code>XmlSeralizer</code></a>, this will produce a string that you can then feed in to a <a href="https://msdn.microsoft.com/en-us/library/system.io.streamwriter(v=vs.110).aspx" rel="nofollow"><code>StreamWriter</code></a> which will convert the string to a <code>byte[]</code> and write it out on to the socket. The other end would just use the reverse process using a <code>StreamReader</code>.</p> <p>If you do not want to use that intermediate text step I would <strong><em>NOT</em></strong> recomend using <a href="https://msdn.microsoft.com/en-us/library/system.runtime.serialization.formatters.binary.binaryformatter(v=vs.110).aspx" rel="nofollow"><code>BinaryFormatter</code></a> like you see frequently on the internet, it is very "fragil" and having different levels of .NET Windows updates installed on both ends can end up breaking it. Instead I recommend using a 3rd party binary serializer like <a href="https://code.google.com/p/protobuf-net/" rel="nofollow">Protobuf-net</a></p>