2016-09-05 6 views
0

단순화 된 클래스 모델을 포함한 JSON 개체를 만들 수 있습니다 :사용 System.Web.Script.Serialization.JavaScriptSerializer 비 공공/친구 등록

Class ShoppingBasket 
    Property Items as BasketItems() 
    ..... 
    Class BasketItems 
     Property ItemName as string 
     Property ItemPrice as Decimal 
     Friend ItemCost as Decimal 
     .... 
    End Class 

이 분명 쇼핑 카트 시스템입니다.

Dim basket as new ShoppingBasket 
Dim BasketString as string 
Dim JS as new System.Web.Script.Serialization.JavaScriptSerializer 

BasketString = JS.Serialize(basket).ToString() 

.... now save BasketString into the database... 

이 코드는 모든 실행 잘하지만 나는 Friend 선언 속성 "ItemCost"잃을 :

나는, 데이터베이스에 간단한 코드를이 쇼핑 바구니의 직렬화 된 문자열을 저장할 수 있어야합니다.

이 클래스는 내가 ItemCost 속성 (각종 다른 사람을)하려는 ​​AJAX 버튼 "장바구니에 추가"에서 반환 속성으로 사용하므로되어 사용자의 브라우저에 외부 자바 스크립트 콘솔/개발 콘솔에서 숨길 수 ,하지만 내부적으로 위의 방법을 사용하여 전체 클래스 데이터를 저장하고 복구 할 수 있어야합니다.

그래서, 어떻게 그것이 JavaScriptSerilaizer 클래스에서 문자열로 할 때 특히 직렬화 직렬화 할 수 있도록 Friend 속성을 생성하지 않지만, 그것이 AJAX POST 반응에 의해 반환 된 (내부적으로 직렬화) 할 때?

답변

0

XmlSerializer과 마찬가지로 JavaScriptSerializer은 공용 속성과 필드 만 serialize합니다. 비 공용 속성을 JavaScriptSerializer에 의해 serialize되도록하려면 [DataMember]과 같은 특성이 없습니다. 이처럼 사용 후

Imports System.Web.Script.Serialization 

Public Class ShoppingBasket 
    Public Property Items as BasketItems() 

    Public Class BasketItems 
     Public Property ItemName as string 
     Public Property ItemPrice as Decimal 
     Friend ItemCost as Decimal 
    End Class 

    Friend Class BasketItemsConverter 
     Inherits JavaScriptConverter 
     Const ItemCostName As String = "ItemCost" 

     Public Overrides Function Deserialize(dictionary As IDictionary(Of String, Object), type As Type, serializer As JavaScriptSerializer) As Object 
      ' Perform a default deserialization for public properties. 
      Dim myObj = New JavaScriptSerializer().ConvertToType(Of BasketItems)(dictionary) 
      Dim itemCost As Object 
      If dictionary.TryGetValue(ItemCostName, itemCost) AndAlso itemCost IsNot Nothing Then 
       myObj.ItemCost = serializer.ConvertToType(Of Decimal)(itemCost) 
      End If 
      Return myObj 
     End Function 

     Public Overrides Function Serialize(obj As Object, serializer As JavaScriptSerializer) As IDictionary(Of String, Object) 
      ' Generate a default serialization for public properties. Is there an easier way to do this? 
      Dim defaultSerializer = New JavaScriptSerializer() 
      Dim dict = defaultSerializer.Deserialize(Of Dictionary(Of String, Object))(defaultSerializer.Serialize(obj)) 

      Dim basketItem = DirectCast(obj, BasketItems) 
      dict(ItemCostName) = basketItem.ItemCost 

      Return dict 
     End Function 

     Public Overrides ReadOnly Property SupportedTypes() As IEnumerable(Of Type) 
      Get 
       Return { GetType(BasketItems) } 
      End Get 
     End Property 
    End Class  
End Class 

과 :

대신 직렬화 및 자동 BasketItems의 모든 public 속성을 역 직렬화하고 ItemCost도 추가하는 JavaScriptConverterFriend의 범위를 만들 수 있습니다

Dim JS as new System.Web.Script.Serialization.JavaScriptSerializer() 
JS.RegisterConverters({ new ShoppingBasket.BasketItemsConverter() })     

Dim BasketString = JS.Serialize(basket).ToString() 

또는 내부적으로 문자열로 직렬화 할 때 으로 전환 한 다음 비공개 속성을으로 표시하는 방법을 고려해 볼 수 있습니다.