4

xmlでオブジェクトを作成するために使用された元のクラスを持たずに、いくつかのxmlを逆シリアル化しようとしています。このクラスはComOpcClientConfigurationと呼ばれます。
ServerUrlとServerUrlHdaの値は正常に設定されていますが、残りの値は設定されていません...
したがって、私が求めているのは、これらの値の残りを正しく設定するにはどうすればよいですか。また、現在のコードで機能しないのはなぜですか。

これが私の逆シリアル化コードです:
confはComClientConfigurationxmlを表すXElementです

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

ComClientConfigurationとComOpcClientConfigurationが必要な理由はわかりません。おそらく、既知のタイプのハックを行うためのより良い方法があります。しかし今のところそれは私が持っているものです。

これがファイルにある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
}

さらに、このクラスを作成する必要がありました。同じですが、名前が異なります。タイプの命名全体がどのように機能するのか正確にはわからないため、シリアライザーの既知のタイプに使用されます。

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

    ... Same innards as ComClientConfiguration
}
4

2 に答える 2

3

Data-contract-serializer は...うるさいです。特に、単に要素の順序がここで問題なのだろうかと思います。ただし、XML を操作するための最適なツールであるとは限りません。XmlSerializer は、おそらくここではより堅牢です。はるかに優れた範囲の XML を処理できます。DCSは、それが主な目標であるため、それを意図したものではありません。

単純な XML では、多くの場合、属性などは必要ありません。既存の XML で xsd.exe を使用して、一致する c# クラスを生成することもできます (XML から xsd へ、xsd から c# への 2 つのステップ)。

于 2010-10-08T21:08:57.577 に答える
2

すべての値を取得するには、順序をハードコーディングしてみてください (そうしないと、アルファベット順で試行される可能性があります)。

[DataMember(Name = "ServerUrl", Order = 0)]
..
[DataMember(Name = "ServerName", Order = 1)]
..
[DataMember(Name = "ServerNamespaceUrl", Order = 2)]
..
[DataMember(Name = "MaxReconnectWait", Order = 3)]
..
于 2014-04-18T12:40:25.527 に答える