我想序列化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。
答案 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>
很方便,可以满足您的需求。