为何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