C # объект в строку и обратно - PullRequest
12 голосов
/ 08 августа 2011

Моя проблема: У меня динамический кодовый компилятор. Который может скомпилировать фрагмент кода. Остальная часть кода. (import, namespace, class, main function) уже есть. Фрагмент вставляется в него, а затем компилируется в сборку и выполняется. Вот как пользователь может выполнить фрагмент кода. Основная функция (где выполняется фрагмент) имеет тип возвращаемого объекта. Этот фрагмент кода выполняется на удаленном компьютере. Код отправляется клиентом на веб-сервер. Удаленный компьютер считывает код с веб-сервера и выполняет его. На удаленном компьютере я могу легко просматривать тип возвращаемого объекта и его значение. Однако я могу отправлять только строки на веб-сервер.

Вопрос: как связать объект в строку, независимо от типа и как преобразовать его обратно?

Пробовал: я пытался использовать ToString (), который отлично работает при использовании int, string, double и bool. Но с изображением или другим типом это не работает, конечно, потому что мне также нужно иметь возможность преобразовать его обратно:)

Буду рад, если кто-нибудь сможет мне помочь:)

Привет

Ответы [ 3 ]

20 голосов
/ 08 августа 2011

Сериализация объекта с использованием 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);
   }
}
0 голосов
/ 02 июня 2019

Это старый вопрос, но я думаю, что у меня есть решение, которое может работать лучше в большинстве случаев (оно создает более короткую строку и не требует атрибута 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 голосов
/ 08 августа 2011

Вам потребуется создать метод преобразования, чтобы отобразить его и сериализовать, чтобы иметь возможность преобразовывать его туда и обратно.

Например:

    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();
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...