C#对象到字符串并返回

C#对象到字符串并返回,c#,string,object,C#,String,Object,我的问题: 我有一个动态编解码器,可以编译一段代码。代码的其余部分。(导入、命名空间、类、主函数)已存在。将代码段插入其中,然后将其编译为程序集并执行。这就是用户能够执行代码段的方式。main函数(执行代码段的地方)的返回类型为object。此代码段在远程计算机上执行。该代码由客户端发送到Web服务器。远程计算机从Web服务器读取代码并执行它。在远程计算机上,我可以轻松查看返回对象的类型及其值。但是,我只能向Web服务器发送字符串 问题: 如何将对象转换为字符串,无论其类型是什么,以及如何将其转

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

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

已尝试:

我尝试了使用ToString(),当使用int、string、double和bool时,它可以很好地工作。但是对于图像或其他类型,is当然不起作用,因为我还需要能够将其转换回。

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

例如:

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

使用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 T FromBase64(此字符串为base64Text)
{
byte[]bytes=Convert.FromBase64String(base64Text);
string json=Encoding.Default.GetString(字节);
返回JsonConvert.DeserializeObject(json);
}

你正在寻找的是所谓的序列化-在这个网站上搜索这个术语,你会发现很多信息。@Marc-hmm,
会话可能更好?我正是这么想的。但是,如果是位图,如何将其转换回?我已经读过一些关于xml序列化的东西,但是你不能用图像来实现。。我认为转换为base64字符串??您可以像@Anders建议的那样将其转换为base64。如果将其存储在会话中,则可以按如下方式获取对象:well@Oskar不,我的意思是:我不确定这个问题与ViewData/Session之类的东西有什么关系-这似乎是一个直接的序列化问题…@Marc嗯,我只是猜测他正在使用asp.NETWeb来执行代码。在这种情况下,您可以使用会话来存储对象。当然,这假定对象可以使用
BinaryFormatter
进行序列化。加上
BinaryFormatter
让我哭泣;p但它确实解决了这个问题…Marc,我知道:)但是由于没有版本控制或持久性(这就保证了使用另一种序列化技术),binaryformatter(几乎只有binary formatter)可以工作。深度克隆、同一应用程序实例之间的通信等都非常适合BF,假设您想要传递任何对象。对一切[可序列化]的限制基本上是你能拥有的最小限制。为什么它会让你哭泣?有什么特别的原因吗?@Kirk有很多经验可以帮助人们调试二进制格式化程序产生的邪恶;p我在这里提到了其中的一些:-但是安德斯是对的-只要这个连接的两端总是同步的,它就可以正常工作。问题主要出现在用于存储时,或者无法保证两个端点处于同一版本时。stringtoobject出现异常。做ms.Position=0;在回来之前把它修好。