C#对象为字符串和后退

时间:2011-08-08 08:56:11

标签: c# string object

我的问题: 我有一个动态代码编译器。可以编译代码的snippit。 de代码的其余部分。 (导入,命名空间,类,主函数)已经存在。将snippit插入其中然后将其编译为程序集并执行。这是用户能够执行代码snippit的方式。 main函数(执行snippit的地方)有一个返回类型的对象。此snippit在远程计算机上执行。代码由客户端发送到Web服务器。远程计算机从Web服务器读取代码并执行它。在远程计算机上,我可以  轻松查看返回对象的类型及其值。 Hower我只能将字符串发送到网络服务器。

问题:如何将对象转换为字符串,无论类型是什么以及如何将其转换回来?

尝试:我尝试使用ToString(),在使用int,string,double和bool时工作正常。但是对于图像或其他类型是不可行的,因为我还需要能够将其转换回来:)

如果有人可以帮助我,我会很高兴:)

问候

3 个答案:

答案 0 :(得分:18)

使用BinaryFormatter序列化对象,然后将字节作为字符串返回(Base64编码)。向后做可以让你回来。

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);
   }
}

答案 1 :(得分:0)

您必须制作转换方法才能显示它并将其序列化以便能够来回转换。

例如:

    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();
        }
    }

答案 2 :(得分:0)

这是一个古老的问题,但是我认为我有一个可以在大多数情况下更好地工作的解决方案(它创建的字符串更短,并且不需要Serializable属性)。

想法是将对象序列化为JSON,然后将其转换为base64,请参见扩展功能:

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

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

    return Convert.ToBase64String(bytes);
}

为了创建对象,我们需要将base64转换为字节,转换为字符串并将JSON反序列化为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);
}