繁体   English   中英

XML Serialize动态对象

[英]XML Serialize dynamic object

我需要使用以下格式从对象构造一组动态创建的XML节点:

<Root>
    <Name>My Name</Name>
    <DynamicValues>
        <DynamicValue1>Value 1</DynamicValue1>
        <DynamicValue2>Value 2</DynamicValue2>
    </DynamicValues>
</Root>

DynamicValues -tag中的节点名称不是事先知道的。 我最初的想法是,这应该可以使用Expando对象 ,例如:

[DataContract]
public class Root
{
    [DataMember]
    public string Name { get; set; }

    [DataMember]
    public dynamic DynamicValues { get; set; }
}

通过使用值初始化它:

var root = new Root
                    {
                        Name = "My Name",
                        DynamicValues = new ExpandoObject()
                    };

root.DynamicValues.DynamicValue1 = "Value 1";
root.DynamicValues.DynamicValue2 = "Value 2";

然后Xml-serialize它:

string xmlString;

var serializer = new DataContractSerializer(root.GetType());
using (var backing = new StringWriter())
using (var writer = new XmlTextWriter(backing))
{
    serializer.WriteObject(writer, root);
    xmlString = backing.ToString();
}

但是,当我运行它时,我得到一个SerializationException说:

“类型'System.Dynamic.ExpandoObject'与数据契约名称'ArrayOfKeyValueOfstringanyType: http//schemas.microsoft.com/2003/10/Serialization/Arrays '不是预期的。请考虑使用DataContractResolver或添加任何静态未知的类型已知类型的列表 - 例如,通过使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中。

我有什么想法可以达到这个目的吗?

[Serializable]
public class DynamicSerializable : DynamicObject, ISerializable
{
    private readonly Dictionary<string, object> dictionary = new Dictionary<string, object>();

    public override bool TrySetMember(SetMemberBinder binder, object value)
    {
        dictionary[binder.Name] = value;

        return true;
    }

    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        foreach (var kvp in dictionary)
        {
            info.AddValue(kvp.Key, kvp.Value);
        }
    }
}

[KnownType(typeof(DynamicSerializable))]
[DataContract]
public class Root
{
    [DataMember]
    public string Name { get; set; }

    [DataMember]
    public dynamic DynamicValues { get; set; }
}

输出:

<Program.Root xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://
schemas.datacontract.org/2004/07/">
  <DynamicValues i:type="Program.DynamicSerializable">
    <DynamicValue1 xmlns:d3p1="http://www.w3.org/2001/XMLSchema" i:type="d3p1:st
ring" xmlns="">Value 1</DynamicValue1>
    <DynamicValue2 xmlns:d3p1="http://www.w3.org/2001/XMLSchema" i:type="d3p1:st
ring" xmlns="">Value 2</DynamicValue2>
  </DynamicValues>
  <Name>My Name</Name>
</Program.Root>

在vb.net中尝试过但没有得到所需的输出。 需要帮忙。

_ Public Class DynamicSerializable Inherits System.Dynamic.DynamicObject实现ISerializable

Private ReadOnly dict As New Dictionary(Of String, Object)

Public Overrides Function TrySetMember(binder As SetMemberBinder, value As Object) As Boolean
    If Not dict.ContainsKey(binder.Name) Then
        dict.Add(binder.Name, value)
    Else
        dict(binder.Name) = value
    End If
    Return True
End Function

Public Overrides Function TryGetMember(binder As GetMemberBinder, ByRef result As Object) As Boolean
    Return dict.TryGetValue(binder.Name, result)
End Function

Public Sub GetObjectData(info As SerializationInfo, context As StreamingContext) Implements ISerializable.GetObjectData
    For Each keyValPair In dict
        info.AddValue(keyValPair.Key, keyValPair.Value)
    Next
End Sub

结束班

使用的代码:

Dim root As New Root root.name =“1”root.DynamicValues = New DynamicSerializable

    root.DynamicValues.DynamicValue1 = "Value1"
    root.DynamicValues.DynamicValue2 = "Value1"

    Dim serializer = New DataContractSerializer(Root.GetType)
    Dim backing As New StringWriter
    Dim writer As New XmlTextWriter(backing)
    serializer.WriteObject(writer, Root)

输出:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM