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

发布于 2024-09-26 18:10:39 字数 395 浏览 2 评论 0原文

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

非常感谢

In MVC I can do something like the following to serialise an object with an anonymous type to JSON...

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

which would return something like;

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

I'd like to do exactly the same but output xml. I haven't been able to find an equivalent method. Would someone please point me in the right direction?

Many thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

清秋悲枫 2024-10-03 18:10:39

简而言之,您不能,请参阅此帖子。我建议您创建一个具体类型来表示匿名输出的结构,然后使用正常的 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() );
}

The short answer is you cannot, see this post. I recommend you create a concrete type to represent the structure of your anonymous output, and then use a normal XML serialization technique like the example I've provided below.

Here is basic example of how to use this (sorry it's in C# syntax):

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() );
}
挽你眉间 2024-10-03 18:10:39

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

它相当不言自明,并且很容易转换。

As per James' answer there is no native way of doing this. Using Reflector, I examined the System.Web.MVC.dll and and found out how MVC does it. The core of the code is below.

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

It's fairly self-explanatory and was easy enough to convert.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文