序列化PixelFormat

时间:2015-12-06 23:04:11

标签: c# serialization binary-serialization pixelformat

我想序列化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。

1 个答案:

答案 0 :(得分:0)

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

这意味着当您尝试反序列化对象时,字段未正确恢复为其原始值(根本没有初始化,除了默认值),保留反序列化值{{1}无效。所以当然,如果你试图例如检索其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>很方便,可以满足您的需求。