簡體   English   中英

為什么JavaScriptSerializer無法序列化內部屬性?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM