【问题标题】:Serialising a label object with .Net Json使用 .Net Json 序列化标签对象
【发布时间】:2015-08-10 06:07:57
【问题描述】:

我正在尝试使用 json.Net 序列化对象,但出现以下异常。

Newtonsoft.Json.JsonSerializationException: Error getting value from 'Parent' on 'System.Windows.Forms.Label+LabelAccessibleObject'. ---> System.Runtime.InteropServices.COMException: Interface not registered (Exception from HRESULT: 0x80040155)
   at Accessibility.IAccessible.get_accParent()
   at System.Windows.Forms.AccessibleObject.get_Parent()
   at System.Windows.Forms.Control.ControlAccessibleObject.get_Parent()
   at GetParent(Object )
   at Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue(Object target)

这是我用来序列化的代码:

  var settings = new JsonSerializerSettings();
  settings.TypeNameHandling = TypeNameHandling.Objects;
  Console.WriteLine(JsonConvert.SerializeObject(y), Formatting.Indented, settings);

奇怪的是,我认为异常意味着我需要添加可访问性引用,但添加它并没有解决任何问题。

还值得一提的是,在这种情况下y 是一个Label 对象。看起来序列化程序函数正在尝试读取 y 的可访问性属性并失败。


编辑:仅供参考,我已经按照网站上的建议使用包管理器安装了它,所以我怀疑它在 64 上运行 32 位或类似的东西。谢谢。

【问题讨论】:

  • 你说Serialize a Label是什么意思?
  • 我想将标签对象转换为 json 字符串 - 这样我就可以将其写入文件以进行持久存储
  • 使用 JSON.stringify(formToJSON($('#controlid')) 进行序列化
  • 我可以在 C# .net winforms 应用程序中使用它吗?我包括什么才能使用它?谢谢。

标签: c# .net winforms serialization json.net


【解决方案1】:

WinForms 对象相当复杂,我不会尝试序列化所有内容。您不能通过这样做重新创建表单。一个问题是控件添加到表单的顺序(它还控制它们的停靠方式)。

您需要创建 DTO(仅具有相关属性的简单对象)并将其序列化。

public class LabelDTO
{
    public LabeLDTO(Label label)
    {
        Name = label.Name;
        Text = label.Text;
    }

    protected LabelDTO()
    {
    }

    public string Text { get; set; }
    public string Name { get; set; }
}

public class DtoFactory
{
    Dictionary<Type, Func<Control, object> _factories = new Dictionary<Type, Func<Control, object>();

    public DtoFactory()
    {
        _factories.Add(typeof(Label), ctrl => new LabelDTO(ctrl));
    }

    public object Create(Control control)
    {
        Func<Control, object> factoryMethod;
        return _factories.TryGetValue(control.GetType(), out factoryMethod)
            ? factoryMethod(control)
            : throw new NotSupportedException("Failed to find factory for " + control.GetType().FullName); 
    }
}


List<object> formData = new List<object>();
foreach (var control in Form.Controls) 
{
    var dto = DtoFactory.Create(control);
    formData.Add(dto);        
}

var json = JsonConvert.SerializeObject(formData);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-03
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多