【问题标题】:How to Serialize a Control to JSON?如何将控件序列化为 JSON?
【发布时间】:2013-03-05 18:45:20
【问题描述】:

我曾经将控制信息存储在一个 XML 文件中,如下所示:

<Controls>
    <Label Id="heading" Text="This is a heading!" FontStyle="(FontStyleDataHere)" Location="20, 10" />
    <Label Id="bodyText" Text="This is Body text." FontStyle="(FontStyleDataHere)" Location="20, 70" />
</Controls>

我一直在寻找我去年拥有的多页代码的打印版本,这是我留下的唯一备份,现在找不到。

因为我不记得我到底是怎么做到的,所以我总是觉得 XML 非常乏味。所以我想,为什么不试试 JSON。好像轻松了一点……

现在,根据上面的代码,我可以创建一个 Person 类型的类,并序列化对象并将其写入文件(或控制台 - 随便):

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.Text;
using System.Threading.Tasks;

namespace SerializeToJson
{
    class Program
    {
        [DataContract]
        internal class Person
        {
            [DataMember]
            internal String Name;

            [DataMember]
            internal Int32 Age;
        }

        static void Main(string[] args)
        {
            Person person = new Person()
            {
                Name = "Jason rules.",
                Age = 19
            };

            MemoryStream stream = new MemoryStream();
            DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Person));
            serializer.WriteObject(stream, person);

            stream.Position = 0;

            StreamReader reader = new StreamReader(stream);
            Console.Write("Json form of Person object: ");
            Console.WriteLine(reader.ReadToEnd());

            Console.ReadKey();
        }
    }
}

但问题是,我不知道如何将控件序列化为 Json。这是我真正需要的。而且,很明显,我需要在稍后的时间点反序列化它们,以便可以在运行时重新创建它们。

这可以用 JSON 来完成,还是建议我仍然使用 XML?

【问题讨论】:

  • 请问您需要这个做什么?
  • 我有一个应用程序,它允许其用户根据自己的喜好重新排列整个用户界面,所以这就是为什么我需要将控制信息和状态保存到文件并能够再次检索它的原因。跨度>

标签: c# .net xml json linq


【解决方案1】:

好的,我在这里理解,我正在尝试给出答案,您可以为您的 xml 对象创建等效的类。

标签对象的等价类

Public class Lable
{
   [DataMember]
    String Id{get;set;};

    [DataMember]
     String Text {get;set;};

    [DataMember]
    string FontStyle{get;set;}

}

控制对象的等价类

Public class Controls
{
   [DataMember]
   public List<Lable> Lables{ get;set; }
}

现在你只需要序列化包含多个LableControls对象

现在您可以像这样使用 JavaScriptSerializer 简单地序列化对象

JavaScriptSerializer serializer = new JavaScriptSerializer();

序列化:

 string jsonString = serializer.Serialize(objControls);

反序列化:

Controls objControls=serializer.Deserialize<Controls>(jsonString);

【讨论】:

  • 有趣的方法。我现在正在尝试这个。谢谢@Sachin。
  • @JasonVoorhees 嘿,我已经更新了我的代码并为你明确了模式,现在你可以轻松搞定了 :)
  • 非常感谢@Sachin,这很有帮助! :-)
猜你喜欢
  • 1970-01-01
  • 2013-08-20
  • 2022-01-18
  • 2021-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-23
  • 2018-09-08
相关资源
最近更新 更多