title: Protobuf-net with ServiceStack and compact framework
body: <p>I wrote a server that uses servicestack, and a client that connects to it using both JSON and protobuf-net (so I'm sure the server works...).
  Now I need to develop the same client on Windows Mobile with CF3.5, and since servicestack is not supported on CF3.5 I used on the client HttpWebRequest and NewtonSoft.Json.Compact for the json part, this way:</p>
  
  <p>Classes:</p>
  
  <pre><code>[ProtoContract]
  public class ReqPing 
  {
  }
  
  [ProtoContract]
  public class RespPing
  {
      [ProtoMember(1)]
      public string Result { get; set; }
  }
  </code></pre>
  
  <p>Function:</p>
  
  <pre><code>ReqPing iReqPing = new ReqPing();
  
  string json = JsonConvert.SerializeObject(iReqPing);
  
  HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://192.168.0.87:82/json/syncreply/ReqPing");
  req.ContentType = "text/json";
  req.Method = "POST";
  req.ContentLength = json.Length;
  
              using (var streamWriter = new StreamWriter(req.GetRequestStream()))
              {
                  streamWriter.Write(json);
                  streamWriter.Flush();
                  streamWriter.Close();
              }
  
              HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
  
              Stream respStream = resp.GetResponseStream();
  
              string resps;
  
              using (var reader = new StreamReader(respStream, Encoding.UTF8))
              {
                  resps = reader.ReadToEnd();                
              }
  
              respStream.Close();
  
              JsonTextReader jreader = new JsonTextReader(new StringReader(resps));
              JsonSerializer serializer = new JsonSerializer();
              RespPing iRespPing = serializer.Deserialize&lt;RespPing&gt;(jreader);
  </code></pre>
  
  <p>and it works, so now I'm trying to implement the same with protobuf, and I'm stuck here:</p>
  
  <pre><code>ReqPing iReqPing = new ReqPing();
  
  
  var ms = new MemoryStream();?????? correct way?
  
  Serializer.Serialize&lt;ReqPing&gt;(ms, iReqPing);
  
  HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://192.168.0.87:82/x-protobuf/reply/ReqPing");
              req.ContentType = "application/x-protobuf";
              req.Method = "POST";
              req.ContentLength = ????????
  
  how can I write the serialized stream to req??               
  
              HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
  
              Stream respStream = resp.GetResponseStream();
  
              RespPing iRespPing = Serializer.Deserialize&lt;RespPing&gt;(respStream);
  </code></pre>
  
  <p>Anyone can suggest me what's the right way?</p>
  
  <p>Thanks!
  Mattia</p>
  
  <p>EDIT:</p>
  
  <p>Ok on how to use the stream, but I need to set ContentLength too, or I get an error message on GetRequestStream (saying that I must set ContentLength...).
  I made it work with:</p>
  
  <pre><code>byte[] data;
          using(var stream = new MemoryStream()) 
          {
              Serializer.Serialize(stream, iReqPing);
              data = stream.ToArray();
              req.ContentLength = data.Length;
          }
  
          using(var stream = req.GetRequestStream()) 
          {
              stream.Write(data, 0, data.Length);                
          }
  </code></pre>
  
  <p>Is there another obvious way I'm missing?</p>
  
  <p>Another question: 
  I made it work but after two request, at the third it timeouts in GetRequestStream. I noticed I forgot in my previous call to make a call to Close() in my HttpWebResponse, I corrected it and now works.
  The strange thing is that I forgot to close HttpWebResponse even with my JSON version,and there I had no problems...the routine is exactly the same.. can you guess the reason?
  Thanks again!</p>