DataContractSerializer不反序列化所有变量

时间:2010-10-08 18:10:35

标签: c# xml serialization datacontract xelement

我正在尝试反序列化某些xml,而没有用于在xml中创建对象的原始类。该类称为ComOpcClientConfiguration 它成功地设置了ServerUrl和ServerUrlHda值,但没有设置其余值...
所以我要问的是:如何正确设置其余值,以及为什么它们不能使用我当前的代码。

这是我的反序列化代码:
conf是一个XElement,代表ComClientConfiguration xml

DataContractSerializer ser = new DataContractSerializer(typeof(ComClientConfiguration), new Type[] {typeof(ComClientConfiguration), typeof(ComOpcClientConfiguration) });
ComOpcClientConfiguration config = (ComOpcClientConfiguration)ser.ReadObject(conf.CreateReader());

我不知道为什么我必须有ComClientConfiguration和ComOpcClientConfiguration,这可能是一种更好的方法来做我已知的类型hack。但就目前而言,这就是我所拥有的。

这是在文件中查找的xml。

<ComClientConfiguration  xsi:type="ComOpcClientConfiguration" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <ServerUrl>The url</ServerUrl>
   <ServerName>a server name   </ServerName>
   <ServerNamespaceUrl>a namespace url</ServerNamespaceUrl> 
   <MaxReconnectWait>5000</MaxReconnectWait> 
   <MaxReconnectAttempts>0</MaxReconnectAttempts> 
   <FastBrowsing>true</FastBrowsing>
   <ItemIdEqualToName>true</ItemIdEqualToName>
   <ServerUrlHda>hda url</ServerUrlHda>
 </ComClientConfiguration>

这是我为反序列化而构建的类:

[DataContract(Name = "ComClientConfiguration", Namespace = "http://opcfoundation.org/UA/SDK/COMInterop")]
public class ComClientConfiguration
{
    public ComClientConfiguration() { }

    //Prog-ID for DA-connection
    [DataMember(Name = "ServerUrl"), OptionalField]
    public string ServerUrl;//url
    [DataMember(Name = "ServerName")]
    public string ServerName;
    [DataMember(Name = "ServerNamespaceUrl")]
    public string ServerNamespaceUrl;//url
    [DataMember(Name = "MaxReconnectWait")]
    public int MaxReconnectWait;
    [DataMember(Name = "MaxReconnectAttempts")]
    public int MaxReconnectAttempts;
    [DataMember(Name = "FastBrowsing")]
    public bool FastBrowsing;
    [DataMember(Name = "ItemIdEqualToName")]
    public bool ItemIdEqualToName;

    //ProgID for DA-connection
    [DataMember, OptionalField]
    public string ServerUrlHda;//url
}

我还必须制作这个课程,它是相同的,但有不同的名称。用于Serializer中的已知类型,因为我不确切知道整个类型命名的工作原理。

[DataContract(Name = "ComOpcClientConfiguration", Namespace = "http://opcfoundation.org/UA/SDK/COMInterop")]
public class ComOpcClientConfiguration
{
    public ComOpcClientConfiguration() { }

    ... Same innards as ComClientConfiguration
}

2 个答案:

答案 0 :(得分:3)

Data-contract-serializer是......挑剔。特别是,我想知道元素顺序是否只是这里的问题。但是,它也不一定是使用XML的最佳工具。 XmlSerializer在这里可能更强大 - 它可以处理更好的XML范围。 DCS并不打算用它作为主要目标。

使用简单的XML,您甚至不需要任何属性等。您甚至可以在现有XML上使用xsd.exe来生成匹配的c#类(分两步; XML-to-xsd; xsd-to-c# )。

答案 1 :(得分:2)

要获取所有值,请尝试对订单进行硬编码(否则可能尝试按字母顺序排序):

[DataMember(Name = "ServerUrl", Order = 0)]
..
[DataMember(Name = "ServerName", Order = 1)]
..
[DataMember(Name = "ServerNamespaceUrl", Order = 2)]
..
[DataMember(Name = "MaxReconnectWait", Order = 3)]
..