Сериализация объекта System.Windows.Media.ImageSource - PullRequest
3 голосов
/ 31 августа 2011

Я создаю очень простое приложение для чата. Я устанавливаю чат с TCP-соединением. Я часто отправляю сериализованный объект через сетевой поток, потому что так проще программировать. В любом случае, если у меня есть class person{ public string name{get;set;} }, то будет легко сериализовать этот класс. когда я включаю public ImageSource Img {get;set;}, я больше не могу сериализовать этого классного человека.

способ, которым я сериализуюсь, выглядит так:

Person p = new Person();
p.name = \\some name
p.Img = \\ some image

System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(p.GetType());

x.Serialize(connection.stream, p);//here is when the problem comes. I am not able to serialize it if I include an Img

Ответы [ 3 ]

6 голосов
/ 31 августа 2011

Вы не можете сериализовать изображение в XML, но вы можете сохранить его в MemoryStream и кодировать двоичные данные в base64.

string ImageToBase64(BitmapSource bitmap)
{
    var encoder = new PngBitmapEncoder();
    var frame = BitmapFrame.Create(bitmap);
    encoder.Frames.Add(frame);
    using(var stream = new MemoryStream())
    {
        encoder.Save(stream);
        return Convert.ToBase64String(stream.ToArray());
    }
}

BitmapSource Base64ToImage(string base64)
{
    byte[] bytes = Convert.FromBase64String(base64);
    using(var stream = new MemoryStream(bytes))
    {
        return BitmapFrame.Create(stream);
    }
}

Обратите внимание, что base64 не очень эффективен с точки зренияпробел ... Если возможно, было бы лучше передать изображение в двоичном виде, а не в XML.

1 голос
/ 31 августа 2011

Вы можете использовать BinaryFormatter или доступные кодировщики, например http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.jpegbitmapencoder.aspx из System.Windows.Media.Imaging Namespace .Также см. WPF BitmapImage Сериализация / десериализация .Если вы хотите использовать строку (xml), тогда я думаю, что Base64 - единственный способ.

1 голос
/ 31 августа 2011

ваш подход верен, но больше не работает, как только класс Person содержит не сериализуемый объект, как в вашем случае ImageSource.

Если бы мне пришлось решать его, оставаясь рядом с вашим решением, я бы сохранил byte[] изображения и проанализировал его после десериализации, чтобы восстановить ImageSource.

...