使用 JSON 序列化 PictureBox

Serializing a PictureBox with JSON

提问人:TheMostEpic 提问时间:12/31/2019 最后编辑:Selim YildizTheMostEpic 更新时间:12/31/2019 访问量:422

问:

我正在处理一个 C# Windows 窗体应用项目,我需要使用 JSON 序列化 PictureBox 并将其保存到文件中。出于某种原因,JSON在尝试序列化PictureBox时给了我一个错误:

“Newtonsoft.Json.JsonSerializationException:'检测到类型为'System.Windows.Forms.PictureBox'的属性'Owner'的自引用循环。路径:'AccessibilityObject'。

我尝试创建一个新项目并在 PictureBox 上使用序列化,它工作正常。什么可能在我正在处理的当前项目上出现错误?

string dataToSave = JsonConvert.SerializeObject(bagPicture1);
C# WinForms 图片框

评论

0赞 Cotur 12/31/2019
您是否忽略了“参考循环处理”?JsonConvert.SerializeObject(bagPicture1, new JsonSerializerSetting(){ ReferenceLoopHandling = ReferenceLoopHandling.Ignore })
0赞 Charles 12/31/2019
@Cotur我仍然收到一个错误,它无法序列化光标。 也许 pictureBox 的 SerializeObject 只是在设计时模式下才有可能?Custom cursors cannot be converted to string
4赞 Ron Beyer 12/31/2019
不要序列化 Windows 控件,只需序列化控件的内容(在本例中为 )。您是否还需要保留其他属性,例如大小/位置等?Image

答:

1赞 Charles 12/31/2019 #1

您可以像这样序列化 img:

var img = this.pictureBox1.Image;
var ms = new MemoryStream();

// any ImageFormat you like, ImageFormat.Bmp for uncompressed
img.Save(ms, ImageFormat.Jpeg); 

var serialized = JsonConvert.SerializeObject(ms.ToArray());

恢复 img:

var myBytes = JsonConvert.DeserializeObject<byte[]>(serialized);
var img = Bitmap.FromStream(new MemoryStream(myBytes));

评论

1赞 Jimi 12/31/2019
这可以工作(IMO,您应该提到然后将图像反序列化为字节数组,以使答案更有用),但不要使用 ,use(或什么都不使用):Jpeg 是一种有损压缩,反序列化时图像不会相同(即使不会立即引起注意,如果图像不代表均匀颜色的区域)。PNG 将更好地保留颜色信息(在某些特定情况下,您还可以避免例外情况)。ImageFormat.JpegImageFormat.Png