我一直在序列化具有一些内部属性的自定义类型,但在序列化时,似乎使用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,它是内部属性。在序列化中不支持内部属性有什么逻辑吗?
序列化内部属性的解决方法是什么(除了将内部属性更改为公共修饰符)?
答案 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