web-dev-qa-db-ja.com

文字列に戻るC#オブジェクト

私の問題:動的コードコンパイラがあります。 Wichはコードの断片をコンパイルできます。残りのコード。 (インポート、名前空間、クラス、メイン関数)はすでにあります。スニピットはそれに挿入され、アセンブリにコンパイルされて実行されます。これは、ユーザーがコードスニピットを実行できる方法です。メイン関数(スニピットが実行される場所)には、戻り値の型のオブジェクトがあります。このスニピットはリモートコンピュータで実行されます。コードはクライアントからWebサーバーに送信されます。リモートコンピューターは、Webサーバーからコードを読み取り、実行します。リモートコンピュータでは、返されたオブジェクトのタイプとその値を簡単に表示できます。 Howeriは文字列をWebサーバーにのみ送信できます。

質問:タイプが何であるかに関係なく、オブジェクトを文字列に変換するにはどうすればよいですか?また、オブジェクトを元に戻すにはどうすればよいですか?

試しました:ToString()を使用してみました。これは、int、string、double、boolを使用すると正常に機能します。しかし、画像や他のタイプでは、もちろんそれを元に戻す必要があるため、機能しません:)

誰かが私を助けてくれたら嬉しいです:)

ご挨拶

12
Kirk

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);
   }
}
20
Anders Forsgren

これは古い質問ですが、ほとんどの場合、より適切に機能するソリューションがあると思います(短い文字列を作成し、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);
}
0
Aharon Ohayon

表示するための変換方法を作成し、前後に変換できるようにシリアル化する必要があります。

例えば:

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