0

我想序列化System.Windows.Media.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。

4

1 回答 1

0

虽然System.Windows.Media.PixelFormat被标记为[Serializable],但它的每一个字段都被标记[NonSerialized]。因此,当您使用 序列化类型时BinaryFormatter,实际上没有信息写入输出流。

这意味着当您尝试反序列化对象时,这些字段没有正确恢复到它们的原始值(也没有初始化,除了它们的默认值之外),使反序列化的值PixelFormat无效。因此,当然,如果您尝试例如检索它的BitsPerPixel,并且它尝试确定无效格式的每像素位数,则会出现异常。

正如您所发现的,将值序列化为 astring然后再转换回反序列化工作。例如:

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>基于该类的成员构建 a )。但是这PixelFormatConverter很方便,并且可以满足您的需求。

于 2015-12-07T05:44:27.297 回答