【问题标题】:Serializing a PictureBox with JSON使用 JSON 序列化 PictureBox
【发布时间】:2019-12-30 16:12:02
【问题描述】:

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

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

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

string dataToSave = JsonConvert.SerializeObject(bagPicture1);

【问题讨论】:

  • 您是否忽略了“引用循环处理”? JsonConvert.SerializeObject(bagPicture1, new JsonSerializerSetting(){ ReferenceLoopHandling = ReferenceLoopHandling.Ignore })
  • @Cotur 我仍然收到无法序列化光标的错误。 Custom cursors cannot be converted to string也许 PictureBox 的 SerializeObject 在设计时模式下是可能的?
  • 不要序列化windows控件,只序列化控件的内容(在本例中为Image)。您是否还需要保留其他属性,例如大小/位置等?

标签: c# winforms picturebox


【解决方案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());

恢复图片:

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

【讨论】:

  • 这可以工作(IMO,您应该提到图像然后反序列化为字节数组,以使答案更有用),但不要使用ImageFormat.Jpeg,使用ImageFormat.Png(或什么都没有):Jpeg 是一种有损压缩,反序列化时图像将不一样(即使不是立即引人注目,如果图像不代表统一颜色的区域)。 PNG 将更好地保留颜色信息(在某些特定情况下,您还可以避免异常)。
猜你喜欢
  • 2011-03-15
  • 2012-09-05
  • 2021-06-28
  • 2022-01-01
  • 2018-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多