15

My problem:
I have a dynamic codecompiler which can compile a snippet of code. The rest of the code. (imports, namespace, class, main function) is already there. The snippet get inserted into that and then it is compiled to an assembly and executed. This is how user is able execute code snippet. The main function (where the snippet is executed) has a return type of object. This snippet gets executed on a remote computer. The code is send by the client to a webserver. The remote computer reads out the code from the webserver and executes it. On the remote computer I can easily view the type of the returned object and its value. However I can only send strings to the webserver.

Question:
How do I convert a object into a string, no matter what the type is and how do I convert it back?

Tried:
I tried using ToString(), that works fine when using int, string, double and bool. But with an image or an other type is doesn't work of course because I also need to able to convert it back.

1
  • 6
    What you are looking for is called serialization - search for that term in this site and you will find lots of information. Commented Aug 8, 2011 at 8:57

3 Answers 3

22

Serialize the object using the BinaryFormatter, and then return the bytes as a string (Base64 encoded). Doing it backwards gives you your object back.

public string ObjectToString(object obj)
{
   using (MemoryStream ms = new MemoryStream())
   {
     new BinaryFormatter().Serialize(ms, obj);         
     return Convert.ToBase64String(ms.ToArray());
   }
}

public object StringToObject(string base64String)
{    
   byte[] bytes = Convert.FromBase64String(base64String);
   using (MemoryStream ms = new MemoryStream(bytes, 0, bytes.Length))
   {
      ms.Write(bytes, 0, bytes.Length);
      ms.Position = 0;
      return new BinaryFormatter().Deserialize(ms);
   }
}
Sign up to request clarification or add additional context in comments.

10 Comments

This of course assumes that the objects are serializable with BinaryFormatter. Plus BinaryFormatter makes me weep ;p But it does address the question...
Marc, I know :) But given there is no versioning or persistence (that would warrant the use of another serialization technique) the binaryformatter (and pretty much *only the binary formatter) works. Deep cloning, communication between instances of the same app etc. are perfect fits for BF, assuming that you want to pass any object. The restriction of everything [Serializable] is basically the smallest restriction you can have.
Why does it make you go weep? Any particulair reason?
@Kirk lots of experiences of helping people debug the evil that BinaryFormatter makes ;p I mention some of these here: stackoverflow.com/questions/6979153/… - but Anders is right - as long as the two ends of this connection are always in sync, it should work fine. Problems come mainly when used for storage, or when the 2 endpoints can't be guaranteed to be at the same version.
Got an exception with stringtoobject. Doing ms.Position = 0; before returning fixed it.
|
11

It's an old question but I think that I have a solution that can work better for most of the times (it creates a shorter string and doesn't require the Serializable attribute).

The idea is to serialize the object to JSON and then convert it to base64, see the extension function:

public static string ToBase64(this object obj)
{
    string json = JsonConvert.SerializeObject(obj);

    byte[] bytes = Encoding.Default.GetBytes(json);

    return Convert.ToBase64String(bytes);
}

In order to create the object, we need to convert the base64 to bytes, convert to string and deserialize the JSON to T

public static T FromBase64<T>(this string base64Text)
{
    byte[] bytes = Convert.FromBase64String(base64Text);

    string json = Encoding.Default.GetString(bytes);

    return JsonConvert.DeserializeObject<T>(json);
}

Comments

0

You will have to make a conversion method to display it and serialize it to be able to convert it back and forth.

For instance:

    public static string ConvertToDisplayString(object o)
    {
        if (o == null)
            return "null";
        var type = o.GetType();
        if (type == typeof(YourType))
        {
            return ((YourType)o).Property;
        }
        else
        {
            return o.ToString();
        }
    }

8 Comments

@Marc hmm, Session might be better?
Exactly how I was thinking. But how do I convert it back in case of a bitmap? I already read up some stuff about xml serialization but you cant do it with an image.. I thought converting to a base64 string??
You can convert it to base64 just as @Anders proposed. If you store it in the session you can get the object that way as well
@Oskar no, I simply meant: I'm not sure how the question relates to things like ViewData/Session - it seems a straight serialization question...
@Marc Well, I just guessed he is using asp.Net web to execute the code. In that case you could use the session to store the object
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.