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

时间:2016-04-14 16:18:46

标签: c# c#-4.0 serialization 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,它是内部属性。在序列化中不支持内部属性有什么逻辑吗?

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

2 个答案:

答案 0 :(得分:3)

System.Web.Script.Serialization.JavaScriptSerializer中根本不支持。

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

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

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

  

比DataContractJsonSerializer快50%,比它快250%   JavaScriptSerializer。

并且有更多的配置选项,目前是Microsoft for .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"}

虽然我个人认为你因为零价值并且为自己造成了很大的痛苦。我仍然强烈建议您切换到更现代的序列化器。

答案 1 :(得分:1)

The documentation for JavaScriptSerializer处于稀疏状态,我无法找到有关此类型如何处理access modifiers的任何信息。

internal从程序集外部的类型隐藏Property2,因此我假设JavaScriptSerializer中有一些代码要求"我可以在此对象上看到哪些属性?"

这是一个棘手的问题,正如您所见,更强大的序列化系统会询问更好记录的问题"此对象的哪些属性使用序列化提示进行注释?"

请参阅JSON.net(根据JavaScriptSerializer文档中的建议)和DataContractJsonSerializer

相关问题