2017-10-17 107 views
1

是否有可能讓JavaScriptSerializer在沒有setter的情況下也填充屬性?例如,下面代碼中的屬性如test.ID。是否有可能讓JavaScriptSerializer在沒有setter的情況下也填充屬性?

using System; 
using System.Collections.Generic; 
using System.Web.Script.Serialization; 

namespace JavaScriptConverterTest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      List<test> list = new List<test>(); 
      for (int i = 0; i < 2; i++) 
      { 
       list.Add(new test(Guid.NewGuid(), "Item #" + i)); 
      } 
      JavaScriptSerializer serializer = new JavaScriptSerializer(); 
      string jsonString = serializer.Serialize(list); 
      List<test> newList = serializer.Deserialize<List<test>>(jsonString); 
      Console.Read(); 
     } 
    } 

    class test 
    { 
     private Guid id = Guid.Empty; 

     public Guid ID 
     { 
      get { return id; } 
      // Without a setter, JavaScriptSerializer doesn't populate this property. 
      // set { id = value; } 
     } 
     public string name = ""; 

     public test() 
     { 
     } 

     public test(Guid id, string name) 
     { 
      this.id = id; 
      this.name = name; 
     } 
    } 
} 

[忽略] StackOverflow上需要更多的細節。

+1

如果你製作私人設置器,一些序列化將會起作用。其他序列化器允許您使用屬性,以便它可以直接寫入字段,繞過該屬性。我不知道這個如何工作。 –

+0

@JonathanAllen,謝謝,很高興知道,但現在我正在尋找使用C#內置序列化器的解決方案(實際上它不一定是JSON) – agou

+0

我正在談論內置的解決方案。不幸的是,微軟這麼多年來做了這麼多,我無法讓他們分開我的腦海。所以我能提供的最好的是在文檔中尋找什麼。 –

回答

0

您可以使用DataContractJsonSerializer這是建立在.NET Framework和有回家System.Runtime.Serialization.Json。您只需要用DataMemberAttribute裝飾您的字段。比方說,你有這個類:

class Foo 
{ 
    private string _boo; 

    public Foo(string boo) => _boo = boo; 

    public string Boo => _boo; 
} 

裝潢後:

[DataContract] 
    class Foo 
    { 
     [DataMember] private string _boo; 

     public Foo(string boo) => _boo = boo; 

     public string Boo => _boo; 
    } 

和測試:

private static void Main(string[] args) 
     { 
      var foo = new Foo("boo"); 
      var serializer = new DataContractJsonSerializer(typeof(Foo)); 
      string str; 
      using (var stream = new MemoryStream()) 
      { 
       serializer.WriteObject(stream, foo); 
       str = Encoding.Default.GetString(stream.ToArray()); 
      } 

      Console.WriteLine(str); 
      Foo loadedFoo; 
      using (var stream = new MemoryStream(Encoding.Default.GetBytes(str))) 
      { 
       loadedFoo = serializer.ReadObject(stream) as Foo; 
      } 
      Console.WriteLine(loadedFoo.Boo); 
      Console.ReadLine(); 
     } 

loadedFoo是從JSON字符串構造被 「噓」 的值爲_boo字段。

相關問題