2010-10-07 84 views
2

在MVC我可以做一些类似下面的序列化对象与匿名类型JSON ...VB.Net序列化匿名类型的XML

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

这将返回类似;

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

我想要做的完全一样,但输出xml。我一直无法找到同等的方法。请有人指点我正确的方向?

非常感谢

回答

1

按照詹姆斯的答案有这样做的没有原生的方式。使用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 

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

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