[英]why can't JavaScriptSerializer serialize internal properties?
我一直在序列化具有一些內部屬性的自定義類型,但在序列化時,似乎使用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,它是內部屬性。 在序列化中不支持內部屬性有什么邏輯嗎?
序列化內部屬性的解決方法是什么(除了將內部更改為public修飾符)?
它在System.Web.Script.Serialization.JavaScriptSerializer
根本不受支持。
我建議你切換到Json.NET 。 在這種情況下你需要做的就是使用json屬性屬性標記內部屬性,它將被Json.NET序列化程序選中。
[Newtonsoft.Json.JsonProperty]
internal string Property2 { get; set; }
值得注意的是,Json.NET的性能要高得多
比DataContractJsonSerializer快50%,比JavaScriptSerializer快250%。
並且有更多的配置選項,目前是Microsoft for .NET的默認選擇。
根據您在評論中的請求,如果您使用DataContractJsonSerializer
,可以使用.NET FCL庫執行此操作,盡管這表明它在api方面有很多痛苦,並且需要使用[DataContract]
標記每個類和屬性[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"}
雖然我個人認為你是零價值的教條,並為自己造成很大的痛苦。 我仍然強烈建議您切換到更現代的序列化程序。
JavaScriptSerializer的文檔很少,我找不到任何關於該類型如何處理訪問修飾符的內容 。
internal
隱藏了程序集外部類型的Property2,因此我假設JavaScriptSerializer中有一些代碼詢問“我可以在此對象上看到哪些屬性?”
正如您所見,這是一個棘手的問題,更強大的序列化系統會詢問更好的文檔問題“此對象的哪些屬性使用序列化提示進行注釋?”
請參閱JSON.net (在JavaScriptSerializer文檔中推薦)和DataContractJsonSerializer
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.