反序列化用XmlSerializer序列化的byte []

时间:2010-10-21 18:11:04

标签: c# xml-serialization

我有一个使用以下代码序列化的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 个答案:

答案 0 :(得分:3)

iVBORw0KGgoAAAANSUhEUgAAAPAAAAFACAIAAAANimYEAAAAA...

是二进制数据的base64编码表示。

0x89504E470D0A1A0A0000000D49484452000000F000000140080...

是十六进制的。

要从磁盘获取数据,请使用XmlSerializer并将其反序列化为原始对象:

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属性的getter和setter中似乎不是这种情况。