代码之家  ›  专栏  ›  技术社区  ›  Basic

VB.Net版将匿名类型序列化为xml

  •  2
  • Basic  · 技术社区  · 16 年前

    在MVC中,我可以执行如下操作,将匿名类型的对象序列化为JSON。。。

        Public Function GetStateList() As JsonResult
            Dim MyObject = New With {.Id = 1, .Property = "SomeValue"}
            Return Me.Json(MyObject)
        End Function
    

    会有类似的回报;

    {
        "Id": 1,
        "Property"SomeValue",
    }
    

    我想做同样的事情,但是输出xml。我还没有找到一个等效的方法。有人能告诉我正确的方向吗?

    非常感谢

    2 回复  |  直到 16 年前
        1
  •  1
  •   Community Mohan Dere    9 年前

    简而言之,你看不到 post . 我建议您创建一个具体的类型来表示匿名输出的结构,然后使用常规的XML序列化技术,如我在下面提供的示例。

    下面是如何使用它的基本示例(抱歉,它是C#语法):

    using (MemoryStream memStream = new MemoryStream())
    {
        System.Text.UTF8Encoding utf8 = new System.Text.UTF8Encoding(); 
        // read and convert to byte array
        XmlSerializer serializer = new XmlSerializer( <<yourObject>>.GetType() ); 
        serializer.Serialize( memStream, <<yourObject>>)); 
        string output = utf8.GetString( memStream.ToArray() );
    }
    
        2
  •  1
  •   Basic    9 年前

    根据詹姆斯的回答,这是没有本地的方法。我用反光镜检查了 System.Web.MVC.dll 并找出MVC是如何做到的。代码的核心如下。

    Private Sub SerializeCustomObject(ByVal o As Object, ByVal sb As StringBuilder, ByVal depth As Integer, ByVal objectsInUse As Hashtable, ByVal serializationFormat As SerializationFormat)
        Dim flag As Boolean = True
        Dim type As Type = o.GetType
        sb.Append("{"c)
        If (Not Me.TypeResolver Is Nothing) Then
            Dim str As String = Me.TypeResolver.ResolveTypeId(type)
            If (Not str Is Nothing) Then
                JavaScriptSerializer.SerializeString("__type", sb)
                sb.Append(":"c)
                Me.SerializeValue(str, sb, depth, objectsInUse, serializationFormat)
                flag = False
            End If
        End If
        Dim info As FieldInfo
        For Each info In type.GetFields((BindingFlags.Public Or BindingFlags.Instance))
            If Not info.IsDefined(GetType(ScriptIgnoreAttribute), True) Then
                If Not flag Then
                    sb.Append(","c)
                End If
                JavaScriptSerializer.SerializeString(info.Name, sb)
                sb.Append(":"c)
                Me.SerializeValue(info.GetValue(o), sb, depth, objectsInUse, serializationFormat)
                flag = False
            End If
        Next
        Dim info2 As PropertyInfo
        For Each info2 In type.GetProperties((BindingFlags.GetProperty Or (BindingFlags.Public Or BindingFlags.Instance)))
            If Not info2.IsDefined(GetType(ScriptIgnoreAttribute), True) Then
                Dim getMethod As MethodInfo = info2.GetGetMethod
                If ((Not getMethod Is Nothing) AndAlso (getMethod.GetParameters.Length <= 0)) Then
                    If Not flag Then
                        sb.Append(","c)
                    End If
                    JavaScriptSerializer.SerializeString(info2.Name, sb)
                    sb.Append(":"c)
                    Me.SerializeValue(getMethod.Invoke(o, Nothing), sb, depth, objectsInUse, serializationFormat)
                    flag = False
                End If
            End If
        Next
        sb.Append("}"c)
    End Sub
    

    这是相当不言而喻,很容易转换。