我的问题: 我有一个动态代码编译器。可以编译代码的snippit。 de代码的其余部分。 (导入,命名空间,类,主函数)已经存在。将snippit插入其中然后将其编译为程序集并执行。这是用户能够执行代码snippit的方式。 main函数(执行snippit的地方)有一个返回类型的对象。此snippit在远程计算机上执行。代码由客户端发送到Web服务器。远程计算机从Web服务器读取代码并执行它。在远程计算机上,我可以 轻松查看返回对象的类型及其值。 Hower我只能将字符串发送到网络服务器。
问题:如何将对象转换为字符串,无论类型是什么以及如何将其转换回来?
尝试:我尝试使用ToString(),在使用int,string,double和bool时工作正常。但是对于图像或其他类型是不可行的,因为我还需要能够将其转换回来:)
如果有人可以帮助我,我会很高兴:)
问候
答案 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);
}