我的问题:我有一个动态代码编译器.可以编译代码的snippit.de代码的其余部分.(导入,命名空间,类,主函数)已经存在.将snippit插入其中然后将其编译为程序集并执行.这是用户能够执行代码snippit的方式.main函数(执行snippit的地方)有一个返回类型的对象.此snippit在远程计算机上执行.代码由客户端发送到Web服务器.远程计算机从Web服务器读取代码并执行它.在远程计算机上,我可以轻松查看返回对象的类型及其值.我只能向网络服务器发送字符串.
问题:如何将对象转换为字符串,无论类型是什么以及如何将其转换回来?
尝试:我尝试使用ToString(),使用int,string,double和bool时工作正常.但是图像或其他类型是不可行的,因为我还需要能够将它转换回来:)
如果有人可以帮助我,我会很高兴:)
问候
And*_*ren 20
使用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);
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个老问题,但我认为我有一个在大多数情况下可以更好地工作的解决方案(它创建更短的字符串并且不需要该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);
}
Run Code Online (Sandbox Code Playgroud)
为了创建对象,我们需要将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);
}
Run Code Online (Sandbox Code Playgroud)
您必须创建一个转换方法来显示它并序列化它,以便能够来回转换它。
例如:
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();
}
}
Run Code Online (Sandbox Code Playgroud)