2017-10-17 9 views
1

JavaScriptSerializer도 설정자없이 속성을 채울 수 있습니까? 예를 들어, 아래 코드에서 test.ID와 같은 속성.JavaScriptSerializer도 설정자없이 속성을 채울 수 있습니까?

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

개인 설정기를 만들면 일부 직렬화가 작동합니다. 다른 serializer를 사용하면 특성을 사용하지 않고 속성을 무시하고 필드에 직접 쓸 수 있습니다. 나는 이것이 어떻게 작동하는지 모른다. –

+0

@JonathanAllen, 알아두면 좋지만 지금은 C# build-serializer (실제로 JSON 일 필요는 없습니다)를 사용하는 솔루션을 찾고 있습니다. – agou

+0

나는 내장 된 것들에 대해 이야기하고 있습니다. 불행히도 Microsoft는 수년 동안 그렇게 많은 사람들을 만들었으므로 나는 내 머리 속에 그들을 따로 둘 수 없습니다. 그래서 제가 제공 할 수있는 가장 좋은 것은 문서에서 찾아야 할 부분입니다. –

답변

0

당신은 .NET 프레임 워크에 내장 System.Runtime.Serialization.Json에서 홈을 가지고 있습니다 DataContractJsonSerializer를 사용할 수 있습니다. 필드를 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; 
    } 

그리고 테스트를 다음 JSON 문자열로 구성되는 loadedFoo과 같이 "우우"를 얻을 수

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(); 
     } 

_boo 필드 값입니다.