编程语言
首页 > 编程语言> > 为何JavaScriptSerializer无法序列化内部属性?

为何JavaScriptSerializer无法序列化内部属性?

作者:互联网

我一直在序列化具有一些内部属性的自定义类型,但是在序列化时,似乎使用System.Web.Script.Serialization.JavaScriptSerializer的serialize方法不会序列化内部属性(因为它会跳过序列化字符串中的内部属性).
从以下代码和输出可以很容易地理解它:

public class MyClass
{
    public string Property1 { get; set; }

    internal string Property2 { get; set; }

    public string Property3 { get; set; }
}

JavaScriptSerializer mySerializer = new JavaScriptSerializer();
string jsonString = mySerializer.Serialize(new MyClass()
{
            Property1 = "One",
            Property2 = "Twp",
            Property3 = "Three"
});

jsonString具有以下值:

{"Property1":"One","Property3":"Three"}

在输出中,您可以看到序列化的字符串没有作为内部属性的Property2.它背后是否存在某种逻辑,用于不支持序列化中的内部属性?

序列化内部属性的解决方法是什么(将internal更改为public修饰符除外)?

解决方法:

System.Web.Script.Serialization.JavaScriptSerializer根本不支持它.

我建议您切换到Json.NET.在这种情况下,您需要做的就是用json属性属性标记内部属性,然后Json.NET序列化程序将其选中.

[Newtonsoft.Json.JsonProperty]
internal string Property2 { get; set; }

值得注意的是,Json.NET的性能要高得多

50% faster than DataContractJsonSerializer, and 250% faster than
JavaScriptSerializer.

并且具有更多的配置选项,目前是Microsoft .NET的默认选择.

根据您在注释中的请求,如果您使用DataContractJsonSerializer,则可以使用.NET FCL库执行此操作,尽管这在api和需要使用[DataContract标记每个单个类和属性的方面都表现出了它自己的麻烦. ]和[DataMember].

using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;

var instance = new MyClass {
        Property1 = "One",
        Property2 = "Twp",
        Property3 = "Three"
};

var ser = new DataContractJsonSerializer(instance.GetType());

using (MemoryStream ms = new MemoryStream())
{
    ser.WriteObject(ms, instance);
    string jsonData = Encoding.Default.GetString(ms.ToArray());
}

[DataContract]
public class MyClass
{
    [DataMember]
    public string Property1 { get; set; }
    [DataMember]
    internal string Property2 { get; set; }
    [DataMember]
    public string Property3 { get; set; }
}

这将正确输出

{"Property1":"One","Property2":"Twp","Property3":"Three"}

尽管我个人认为您对零价值信奉教条,并给自己造成很大的痛苦.我仍然强烈建议您切换到更现代的序列化器.

标签:c-4-0,serialization,javascriptserializer,c
来源: https://codeday.me/bug/20191027/1942101.html