すべてWCFは、オブジェクトのシリアライズすることはできません(System.Byteは、[*]と入力)
基本的に私のWCFサービスは、DCOMサーバーに接続し、「VARIANT」フィールドを含む構造体を取得し、私のWCFにそれを渡す必要がありますサービスクライアント。私はこのデータコントラクトを期待するので、ネイティブDCOMサービス
[DataContract]
[ComVisible(true)]
[StructLayout(LayoutKind.Sequential)]
public struct tagProcReadAns
{
[DataMember]
[MarshalAs(UnmanagedType.Struct)]
public object vItemValue; //VARIANT: marshalled as object in C#
[DataMember]
public ushort wQuality;
[DataMember]
public Int32 Error;}
から得
この本のための私のWCFデータ契約が構造体ですが、私が持っている理由です、COMオブジェクトとして登録し、再びC++コードにマーシャリングすることができます[ComVisible]と[MarshalAs]の部分
とにかく、vItemValueはDCOM Serverから正常に取得したVARIANTオブジェクトです(内容を確認しました)。しかし、例外が発生したときに私はWCFに渡そうとしました。
私は私がVARIANT.vt値があることを見たので、vItemValue VARIANTに含まれるデータは、「バイト配列型」であることを期待「VTUI1 | VT_ARRAY」ので、私は
[DataContract]
[KnownType(TypeOf(byte[])] //new
[ComVisible(true)]
[StructLayout(LayoutKind.Sequential)]
public struct tagProcReadAns
{
[DataMember]
[MarshalAs(UnmanagedType.Struct)]
public object vItemValue; //VARIANT: marshalled as object in C#
[DataMember]
public ushort wQuality;
[DataMember]
public Int32 Error;}
を以下のようのDataContractを変更します私は再びコードを実行するときしかし、私はまだ例外をecountered、トレースを追加することによって、私は、次のエラーメッセージ
There was an error while trying to serialize parameter http://tempuri.org/:aryAns. The InnerException message was 'Type 'System.Byte[*]' with data contract name 'ArrayOfunsignedByte:http://schemas.microsoft.com/2003/10/Serialization/Arrays' is not expected. Consider using a DataContractResolver or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer.'. Please see InnerException for more details.
を持っているデータ型は[]が、バイト[*]をバイトされていないようです?私は何か悪いことはありますか? 例外が示唆しているように、私は何らかの形でこの問題を解決するためにDataContractResolverを使用できます。何か解決策を提案できますか?
は
上記のシリアライゼーションの問題を回避する方法を理解しています。 – BloodroseWu