【问题标题】:Is it possible to make JavaScriptSerializer also populates properties without a setter?是否有可能使 JavaScriptSerializer 也可以在没有设置器的情况下填充属性?
【发布时间】:2017-10-17 18:22:31
【问题描述】:

是否可以让JavaScriptSerializer 也可以在没有设置器的情况下填充属性?比如下面代码中test.ID这样的属性:

using System;
using System.Collections.Generic;
using System.Web.Script.Serialization;

namespace JavaScriptConverterTest
{
    class Program
    {
        static void Main(string[] args)
        {
            List<test> list = new List<test>();
            for (int i = 0; i < 2; i++)
            {
                list.Add(new test(Guid.NewGuid(), "Item #" + i));
            }
            JavaScriptSerializer serializer = new JavaScriptSerializer();
            string jsonString = serializer.Serialize(list);
            List<test> newList = serializer.Deserialize<List<test>>(jsonString);
            Console.Read();
        }
    }

    class test
    {
        private Guid id = Guid.Empty;

        public Guid ID
        {
            get { return id; }
            // Without a setter, JavaScriptSerializer doesn't populate this property.
            // set { id = value; }
        }
        public string name = "";

        public test()
        {
        }

        public test(Guid id, string name)
        {
            this.id = id;
            this.name = name;
        }
    }
}

【问题讨论】:

  • 如果你创建了一个私有的 setter,一些序列化将起作用。其他序列化程序允许您使用属性,以便它可以绕过属性直接写入字段。我不知道这个是如何工作的。
  • @JonathanAllen,谢谢,很高兴知道,但现在我正在寻找使用 C# 内置序列化程序的解决方案(实际上它不必是 JSON)
  • 我说的是内置的。不幸的是,微软多年来制造了如此多的产品,以至于我无法将它们分开。所以我能提供的最好的就是在文档中寻找什么。

标签: c# .net json javascriptserializer


【解决方案1】:

您可以使用 DataContractJsonSerializer,它内置在 .NET Framework 中,其主页位于 System.Runtime.Serialization.Json。您只需要使用 DataMemberAttribute 来装饰您的字段。假设你有这个类:

class Foo
{
    private string _boo;

    public Foo(string boo) => _boo = boo;

    public string Boo => _boo;
}

装修后:

[DataContract]
    class Foo
    {
        [DataMember] private string _boo;

        public Foo(string boo) => _boo = boo;

        public string Boo => _boo;
    }

和测试:

private static void Main(string[] args)
        {
            var foo = new Foo("boo");
            var serializer = new DataContractJsonSerializer(typeof(Foo));
            string str;
            using (var stream = new MemoryStream())
            {
                serializer.WriteObject(stream, foo);
                str = Encoding.Default.GetString(stream.ToArray());
            }

            Console.WriteLine(str);
            Foo loadedFoo;
            using (var stream = new MemoryStream(Encoding.Default.GetBytes(str)))
            {
                loadedFoo = serializer.ReadObject(stream) as Foo;
            }
            Console.WriteLine(loadedFoo.Boo);
            Console.ReadLine();
        }

从 json 字符串构造的 loadedFoo 将“boo”作为 _boo 字段的值。

【讨论】:

    猜你喜欢
    • 2019-06-16
    • 1970-01-01
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-02
    相关资源
    最近更新 更多