b15
b15

Reputation: 2361

Serializing using protobuf-net and sending as postdata in http

I'm using Protobuf-net to try and send a serialized object to a webapplication that I'm running in another project. The Serializer.Serialize<T>() method takes a Stream (to write to) and and instance of T (in this case, a list of a few objects that I set up to work with protobuf-net)

How do I go about doing this? Do I need to write to a file or can I send the stream as postdata somehow? Below you can see I'm using a string as the postdata.

My execute post method

public static void ExecuteHttpWebPostRequest(Uri uri,string postdata, int requestTimeOut, ref string responseContent)
    {
        if (string.IsNullOrEmpty(uri.Host))// || !IsConnectedToInternet(uri))
            return;
        var httpWebReq = (HttpWebRequest)WebRequest.Create(uri);
        var bytePostData = Encoding.UTF8.GetBytes(postdata);
        httpWebReq.Timeout = requestTimeOut*1000;
        httpWebReq.Method = "POST";
        httpWebReq.ContentLength = bytePostData.Length;
        //httpWebReq.ContentType = "text/xml;charset=utf-8";
        httpWebReq.ContentType = "application/octet-stream";
        //httpWebReq.TransferEncoding=
        //httpWebReq.ContentType = "application/xml";
        //httpWebReq.Accept = "application/xml";
        var dataStream = httpWebReq.GetRequestStream();

        dataStream.Write(bytePostData, 0, bytePostData.Length);
        dataStream.Close();
        var httpWebResponse = (HttpWebResponse)httpWebReq.GetResponse();

        // Get the stream associated with the response.
        var receiveStream = httpWebResponse.GetResponseStream();

        // Pipes the stream to a higher level stream reader with the required encoding format. 
        var readStream = new StreamReader(receiveStream,Encoding.Default);
        responseContent = readStream.ReadToEnd();
        httpWebResponse.Close();

    }

Upvotes: 0

Views: 353

Answers (1)

Marc Gravell
Marc Gravell

Reputation: 1064204

You can just serialize to the request:

Serializer.Serialize(dataStream, obj);

And equally, you can deserialize from receiveStream, if you choose.

Note, however, that protobuf data is not text, and should not be treated as such - very bad things happen if you try that.

Upvotes: 1

Related Questions