2010-10-07 3 views
2

В MVC я могу сделать что-то вроде следующего сериализация объекта с анонимного типа в формате JSON ...VB.Net Serialize анонимный тип в 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()); 
} 
Смежные вопросы