【问题标题】:VB.Net Serialize anonymous type to xmlVB.Net 将匿名类型序列化为 xml
【发布时间】:2010-10-07 23:19:21
【问题描述】:

在 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。我一直无法找到等效的方法。有人能指出我正确的方向吗?

非常感谢

【问题讨论】:

    标签: vb.net .net-4.0 xml-serialization anonymous-types


    【解决方案1】:

    简短的回答是您不能,请参阅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】:

      根据詹姆斯的回答,没有本地方法可以做到这一点。使用 Reflector,我检查了 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
      

      这是不言自明的,很容易转换。

      【讨论】:

        猜你喜欢
        • 2011-01-25
        • 2011-03-13
        • 2012-08-07
        • 2017-01-17
        • 2012-08-05
        • 1970-01-01
        • 2010-09-24
        • 2020-04-06
        • 2011-09-19
        相关资源
        最近更新 更多