c#对象到字符串和返回

本文关键字:返回 字符串 对象 | 更新日期: 2023-09-27 18:05:03

我的问题:
我有一个可以编译代码片段的动态协反编译器。其余的代码。(导入、命名空间、类、主函数)已经存在了。将代码段插入其中,然后将其编译为程序集并执行。这就是用户能够执行代码片段的方式。main函数(执行代码片段的地方)的返回类型是object。此代码片段在远程计算机上执行。代码由客户端发送到web服务器。远程计算机从web服务器读取代码并执行它。在远程计算机上,我可以很容易地查看返回对象的类型及其值。但是,我只能发送字符串到web服务器。

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

尝试:
我尝试使用ToString(),当使用int, string, double和bool时效果很好。但是如果是图片或者其他类型当然就不行了因为我还需要把它转换回来

c#对象到字符串和返回

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

这是一个老问题,但我认为我有一个解决方案,可以更好地为大多数时间(它创建一个更短的字符串,不需要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);
}

您必须创建一个转换方法来显示它并将其序列化以便能够来回转换。

例如:

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