2012-01-26 6 views
4

У меня есть этот код в моей службе WCF:WCF Изображение Сериализация

public class MyImage 
{ 
    public Image Image { get; set; } 
    public string FullPath { get; set; } 
} 

[ServiceContract] 
public interface IMyService 
{ 
    [OperationContract] void SaveImage(MyImage myImg); 
} 

public class MyService : IMyService 
{ 
    public void SaveImage(MyImage myImg) 
    { 
     // ... 
    } 
} 

Но эта ошибка происходит при запуске методы SaveImage():

Была ошибку при попытке сериализовать параметр http://tempuri.org/:e. Сообщение InnerException было «Тип« System.Drawing.Bitmap »с именем контракта данных« Растровое изображение: http: //schemas.datacontract.org/2004/07/System.Drawing »не ожидается. Рассмотрите возможность использования DataContractResolver или добавьте любые типы, не известные статически в список известных типов - например, с помощью атрибута KnownTypeAttribute или путем добавления их в список известных типов, переданных DataContractSerializer. '

Мой код находится на C#, Framework 4.0, в Visual Studio 2010 Pro.

Пожалуйста, помогите, заблаговременно.

ответ

14

Ожидаемый контракт с данным контрактом Image, но он получил экземпляр Bitmap : Image. WCF любит знать о наследовании заранее, поэтому вам нужно будет рассказать об этом. Но! Я честно не думаю, что это хороший подход; вы должны просто просто выбросить необработанный двоичный файл, что, вероятно, означает сначала сохранить Image на MemoryStream. Вы также должны формально украсить свой тип контракта. Я бы отправка:

[DataContract] 
public class MyImage 
{ 
    [DataMember] 
    public byte[] Image { get; set; } 
    [DataMember] 
    public string FullPath { get; set; } 
} 

Пример получения в byte[]:

using(var ms = new MemoryStream()) { 
    image.Save(ms, ImageFormat.Bmp); 
    return ms.ToArray(); 
} 
+0

Я использую метод Image.FromFile() для получения изображения без используя класс Bitmap. Как преобразовать изображение в байт []? –

+0

Он работает. Спасибо за помощь. –

+0

Можете ли вы дать код для десериализации? – user

1

Как вы можете прочитать здесь: Need serialize bitmap image silverlight изображение не сериализации. Таким образом, вы можете превратить изображение в массив байтов (любого формата, который вам нравится, от простых цветов до официального формата, такого как PNG), и использовать его

+0

System.Drawing.Image имеет SerializableAttribute, поэтому я думаю, что он сериализуем. См. Здесь для справки: http://msdn.microsoft.com/en-us/library/system.drawing.image.aspx –

+0

Этот атрибут не предназначен для сериализации XML. WCF использует DataContractSerializer. http://msdn.microsoft.com/en-us/library/system.runtime.serialization.datacontractserializer.aspx, который использует сериализацию XML. –

+0

Хорошо, я просто преобразую его в байт []. Благодарю. –

Смежные вопросы