JSON <NonSerialized()> 不工作 VB.NET?

JSON <NonSerialized()> not working VB.NET?

我在 VB.NET 中进行的某些 JSON 序列化遇到了一些麻烦。

基本上,我有两个 classes。

MenuItemDataLong 并且 MenuItemDataShort

MenuItemDataLong 继承 MenuItemDataShort.

代码:

MenuItemDataShort.vb

<Serializable()>
Public Class MenuItemDataShort
    Public Display_Name As String = ""
    Public Display_Description As String = ""
    Public Display_Price As Single = 0.0

    Public SELECTED_NAME As Integer = 0
    Public SELECTED_PRICE As Integer = 0

    Public WEB_IMAGE As String = ""
    Public WEB_IMAGE_WIDTH As Integer = 0
    Public WEB_IMAGE_HEIGHT As Integer = 0

    Public PAGE_NUM As Integer = 0
    Public CELL_ID As Integer = 0

    Public SHOW_BMP_FILE As Boolean = False
    Public SHOW_DESCRIPT As Boolean = False
    Public SHOW_PRICE As Boolean = False
    Public SHOW_LONG_DESC As Boolean = False

    Public LONG_DESC_FONT_NAME As String
    Public LONG_DESC_FONT_BOLD As Boolean
    Public LONG_DESC_FONT_UNDERLINE As Boolean
    Public LONG_DESC_FONT_ITALIC As Boolean
    Public LONG_DESC_FONT_COLOR_R As Integer
    Public LONG_DESC_FONT_COLOR_G As Integer
    Public LONG_DESC_FONT_COLOR_B As Integer
    Public LONG_DESC_FONT_SIZE As Integer

    Public DESC_FONT_NAME As String
    Public DESC_FONT_BOLD As Boolean
    Public DESC_FONT_UNDERLINE As Boolean
    Public DESC_FONT_ITALIC As Boolean
    Public DESC_FONT_COLOR_R As Integer
    Public DESC_FONT_COLOR_G As Integer
    Public DESC_FONT_COLOR_B As Integer
    Public DESC_FONT_SIZE As Integer

    Public PRICE_FONT_NAME As String
    Public PRICE_FONT_BOLD As Boolean
    Public PRICE_FONT_UNDERLINE As Boolean
    Public PRICE_FONT_ITALIC As Boolean
    Public PRICE_FONT_COLOR_R As Integer
    Public PRICE_FONT_COLOR_G As Integer
    Public PRICE_FONT_COLOR_B As Integer
    Public PRICE_FONT_SIZE As Integer

    Public DESC_X As Integer
    Public DESC_Y As Integer
    Public PRICE_X As Integer
    Public PRICE_Y As Integer
    Public IMAGE_X As Integer
    Public IMAGE_Y As Integer
    Public LONG_DESC_X As Integer
    Public LONG_DESC_Y As Integer
End Class

MenuItemDataLong.vb

<Serializable()>
Public Class MenuItemDataLong
    Inherits MenuItemDataShort

    <NonSerialized()>
    Public DESCRIPT As String

    <NonSerialized()>
    Public OO_Alias As String

    <NonSerialized()>
    Public LONG_DESCRIPTION As String

    <NonSerialized()>
    Public RECIPE_DESCRIPTION As String

    <NonSerialized()>
    Public BMP_FILE As String

    <NonSerialized()>
    Public PRICE1, PRICE2, PRICE3, PRICE4, PRICE5, PRICE6, PRICE7, PRICE8, PRICE9, PRICE10, PRICE11, PRICE12, PRICE13, PRICE14 As Single

End Class

然后我将 MenuItemDataLong 对象存储在某处。 MenuItemDataLong class 中的多余数据在应用程序中是必需的,但是一旦文件被序列化就不需要了。因此,我正在尝试获取 MenuItemDataLong 并将其转换回 MenuItemDataShort 并对其进行序列化。但是,每当我这样做时,我最终都会得到来自 MenuItemDataLong 的所有数据,即使带有 NonSerialized() 标签。

有人知道我做错了什么吗?..

编辑: 如果有人好奇,我就是这样连载的:

Dim sItemData As MenuItemDataShort = CType(ItemData, MenuItemDataShort)
Dim Serializer As New System.Web.Script.Serialization.JavaScriptSerializer
Dim Serialized As String = Serializer.Serialize(sItemData)

您基本上使用了错误的属性。来自 MSDN - NonSerialized:

When using the BinaryFormatter or SoapFormatter classes to serialize an object, use the NonSerializedAttribute attribute to prevent a field from being serialized.

它没有提到JavaScriptSerializer。还有另一个属性:<ScriptIgnore> 似乎有效。使用简化的 类 和实际属性和字段的混合:

Imports System.Web.Script.Serialization

<Serializable()>
Public Class MenuItemShort   
    Public Property Name As String = ""
    Public Description As String = ""
End Class

<Serializable()>
Public Class MenuItemLong
    Inherits MenuItemShort

    <ScriptIgnore>
    Public Property Foo As String
    <ScriptIgnore>
    Public Bar As String

    Public Property Value As Integer
End Class

测试代码:

Dim mi As New MenuItemLong With {.Name = "foo",
                                 .Description = "a foo item",
                                 .Foo = "ghost in the machine",
                                 .Bar = "bar",
                                 .Value = 42}

Dim miS As MenuItemShort = DirectCast(mi, MenuItemShort)

Dim jser As New System.Web.Script.Serialization.JavaScriptSerializer
Dim jss As String = jser.Serialize(miS)

Console.WriteLine(jss)

输出:

{"Description":"a foo item","Value":42,"Name":"foo"}

还有其他方法可以使用 NewtonSoft 的 JSON.Net 忽略某些属性。