私の問題:動的コードコンパイラがあります。 Wichはコードの断片をコンパイルできます。残りのコード。 (インポート、名前空間、クラス、メイン関数)はすでにあります。スニピットはそれに挿入され、アセンブリにコンパイルされて実行されます。これは、ユーザーがコードスニピットを実行できる方法です。メイン関数(スニピットが実行される場所)には、戻り値の型のオブジェクトがあります。このスニピットはリモートコンピュータで実行されます。コードはクライアントからWebサーバーに送信されます。リモートコンピューターは、Webサーバーからコードを読み取り、実行します。リモートコンピュータでは、返されたオブジェクトのタイプとその値を簡単に表示できます。 Howeriは文字列をWebサーバーにのみ送信できます。
質問:タイプが何であるかに関係なく、オブジェクトを文字列に変換するにはどうすればよいですか?また、オブジェクトを元に戻すにはどうすればよいですか?
試しました:ToString()を使用してみました。これは、int、string、double、boolを使用すると正常に機能します。しかし、画像や他のタイプでは、もちろんそれを元に戻す必要があるため、機能しません:)
誰かが私を助けてくれたら嬉しいです:)
ご挨拶
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();
}
}