2015-12-06 11 views
0

Я хотел бы сериализовать объект System.Windows.Media.PixelFormat, а затем воссоздать его путем десериализации. Что я делаю:Serialize PixelFormat

BitmapSource bitmapSource = backgroundImage.ImageSource as BitmapSource; 
PixelFormat pixelFormat = bitmapSource.Format; 
IFormatter formatter = new BinaryFormatter(); 
Stream stream = new FileStream("test", FileMode.Create, FileAccess.Write, FileShare.None); 
formatter.Serialize(stream, pixelFormat); 
stream.Close(); 

, а затем

PixelFormat pixelFormat; 
IFormatter formatter = new BinaryFormatter(); 
Stream stream = new FileStream("test", FileMode.Open, FileAccess.Read, FileShare.Read); 
pixelFormat = (PixelFormat)formatter.Deserialize(stream); 
stream.Close(); 

сериализации не дает каких-либо ошибок. Когда я пытаюсь десериализации этот объект также не дает какой-либо ошибки, но возвращаемый объект не является хорошим, например, в BitsPerPixel поля имеет BitsPerPixel = 'pixelFormat.BitsPerPixel' threw an exception of type 'System.NotSupportedException'

@edit У меня есть работа вокруг этой проблемы. Мы должны использовать PixelFormatConverter для преобразования объекта PixelFormat в строку, а затем сериализуем строку. При десериализации мы получаем строку и с помощью PixelFormatConverter преобразуем ее обратно в PixelFormat.

+0

Вы десериализируетесь на том же или другом компьютере? Поддерживаемые значения некоторых свойств зависят от оборудования (и драйверов). –

+0

Я сериализую и десериализую на том же компьютере. –

+1

Возможно, вы захотите проверить исходный код PixelFormat (http://referencesource.microsoft.com/#PresentationCore/Core/CSharp/System/Windows/Media/PixelFormat.cs,514cf14a5172deb3.references). Это в основном просто обертка для enum-подобной конструкции. Может быть, вы можете сериализовать 'pixelFormat.ToString()', а затем использовать 'PixelFormatConverter', чтобы преобразовать эту строку обратно в' PixelFormat'? – vesan

ответ

0

В то время как System.Windows.Media.PixelFormat отмечен как [Serializable], каждая из его полей отмечена [NonSerialized]. Таким образом, когда вы сериализуете тип с использованием BinaryFormatter, информация не записывается в выходной поток.

Это означает, что при попытке десериализовать объект поля не будут правильно восстановлены до их первоначального значения (но не инициализированы вообще, кроме их значений по умолчанию), оставив десериализованное значение PixelFormat недействительным. Поэтому, конечно, если вы попытаетесь, например, получить его BitsPerPixel, и он пытается определить биты на пиксель для недопустимого формата, вы получаете исключение.

Как вы нашли, сериализуя значение как string, а затем преобразуя обратно в десериализацию. Например:

BitmapSource bitmapSource = backgroundImage.ImageSource as BitmapSource; 
string pixelFormat = bitmapSource.Format.ToString(); 
IFormatter formatter = new BinaryFormatter(); 
Stream stream = new FileStream("test", FileMode.Create, FileAccess.Write, FileShare.None); 
formatter.Serialize(stream, pixelFormat); 
stream.Close(); 

И потом:

PixelFormat pixelFormat; 
IFormatter formatter = new BinaryFormatter(); 
Stream stream = new FileStream("test", FileMode.Open, FileAccess.Read, FileShare.Read); 
pixelFormat = (PixelFormat)new PixelFormatConverter() 
    .ConvertFromString((string)formatter.Deserialize(stream)); 
stream.Close(); 

Вы могли бы, конечно, сделать это явно себя, перечисляя свойства в PixelFormats и смотреть значения вверх (или строительство Dictionary<string, PixelFormat> основаны на элементах этого класса). Но PixelFormatConverter удобен и делает то, что вы хотите.