десериализация байта [], который был сериализован с помощью XmlSerializer - PullRequest
1 голос
/ 21 октября 2010

У меня есть byte[], который был сериализован с помощью следующего кода:

// Save an object out to the disk
public static void SerializeObject<T>(this T toSerialize, String filename)
{
    XmlSerializer xmlSerializer = new XmlSerializer(toSerialize.GetType());
    TextWriter textWriter = new StreamWriter(filename);

    xmlSerializer.Serialize(textWriter, toSerialize);
    textWriter.Close();
}

Проблема в том, что сериализованные данные выглядят следующим образом:

iVBORw0KGgoAAAANSUhEUgAAAPAAAAFACAIAAAANimYEAAAAAXNSR0IArs4c6QAAAARnQU1BAACx......

, когда они сохраняются в моемБаза данных выглядит так:

0x89504E470D0A1A0A0000000D49484452000000F00000014008020000000D8A660400000001......

В чем разница, и как я могу получить данные с диска обратно в byte[]?


Примечание: данные имеют формат Bitmap, отформатированный в виде png:

public byte[] ImageAsBytes
{
    get
    {
        if (_image != null)
        {
            MemoryStream stream = new MemoryStream();
            _image .Save(stream, ImageFormat.Png);
            return stream.ToArray();
        }
        else
        {
            return null;
        }
    }
    set
    {

        MemoryStream stream = new MemoryStream(value);
        _image = new Bitmap(stream);
    }
 }

1 Ответ

3 голосов
/ 21 октября 2010
iVBORw0KGgoAAAANSUhEUgAAAPAAAAFACAIAAAANimYEAAAAA...

- это представление двоичных данных в кодировке base64.

0x89504E470D0A1A0A0000000D49484452000000F000000140080...

- шестнадцатеричное.

Чтобы получить данные с диска, используйте XmlSerializer и десериализуйте их обратно в исходный.object:

public static T DeserializeObject<T>(string filename)
{
    var serializer = new XmlSerializer(typeof(T));
    using (var reader = XmlReader.Create(filename))
    {
        return (T)serializer.Deserialize(reader);
    }
}

Но если у вас есть только строковое представление base64, вы можете использовать метод FromBase64String :

byte[] buffer = Convert.FromBase64String("iVBORw0KGgoAAANimYEAAAAA...");

Примечание: убедитесь, что вы всегда утилизируете одноразовыересурсы, такие как потоки и читатели текста и писатели.Похоже, это не относится ни к вашему методу SerializeObject<T>, ни к получателю и установщику свойства ImageAsBytes.

...