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
}