1

WCFサービスからクライアントアプリにBitmapSourceを送信しようとしています。どちらも.NET3.5アプリケーションです。問題なくオブジェクトをシリアル化できるようですが(例外は発生しません)、クライアントのコールバックが呼び出されることはありません。クライアントで例外をログに記録するトレースを追加した後、DataContractSerializerがBitmapSourceを逆シリアル化できないことがわかりました。

エラーは次のとおりです。'要素'http://schemas.datacontract.org/2004/07/Test.VisionStudio.Remote:Image'には'http://schemas.datacontract.org/2004/07/Systemのデータが含まれています。 Windows.Interop:InteropBitmapのデータコントラクト。デシリアライザーは、このコントラクトにマップされるタイプについての知識を持っていません。'InteropBitmap'に対応する型を既知の型のリストに追加します。たとえば、KnownTypeAttribute属性を使用するか、DataContractSerializerに渡される既知の型のリストに追加します。

それで、私はそれが言ったことを行い、既知のタイプをサービスコントラクトとコールバックコントラクトに追加しましたが、それでも同じエラーが発生します。

これが私が送信しているサービスコールバックコントラクトとデータコントラクトです(無関係なDataMembersを削除します):

[ServiceKnownType(typeof(BitmapSource))]
[ServiceKnownType(typeof(InteropBitmap))]
public interface IZynVisionStudioRemoteServiceCallback
{
    [OperationContract(IsOneWay=true)]
    void OnVisionResultsReady(RemoteVisionProductResult result);

    [OperationContract(IsOneWay = true)]
    void ServiceShuttingDown();
}


[DataContract]
public class RemoteVisionProductResult
{
    private bool _status;
    /// <summary>
    /// Status of the overall inspection. Pass = True, Fail = False
    /// </summary>
    [DataMember]
    public bool Status
    {
        get { return _status; }
        set { _status = value; }
    }

    private string _product;
    /// <summary>
    /// Name of the product the results came from
    /// </summary>
    [DataMember]
    public string Product
    {
        get { return _product; }
        set { _product = value; }
    }

    private string _inspection;
    /// <summary>
    /// Name of the inspection the results came from
    /// </summary>
    [DataMember]
    public string Inspection
    {
        get { return _inspection; }
        set { _inspection = value; }
    }

    private List<RemoteVisionImage> _images = new List<RemoteVisionImage>();
    [DataMember]
    public List<RemoteVisionImage> Images
    {
        get { return _images; }
        set { _images = value; }
    }

    private List<RemoteVisionImage> _imagesWithGraphics = new List<RemoteVisionImage>();
    [DataMember]
    public List<RemoteVisionImage> ImagesWithGraphics
    {
        get { return _imagesWithGraphics; }
        set { _imagesWithGraphics = value; }
    }
}


[DataContract]
public class RemoteVisionImage
{
    /// <summary>
    /// Image uploaded from the vision system
    /// </summary>        
    [DataMember]
    public BitmapSource Image { get; set; }

    /// <summary>
    /// Name of the camera the image was uploaded from
    /// </summary>
    [DataMember]
    public string Camera { get; set; }

    public RemoteVisionImage()
    {
    }
}

この画像をネットワーク経由で送信できない理由を誰かが理解するのを手伝ってもらえますか?

編集:追加する必要があります。クライアントは期待どおりにサービス参照を更新し、アセンブリをサービスと共有するため、RemoteVisionProductResultとRemoteVisionImageの実装もクライアント上にあります。

4

2 に答える 2

1

私は過去に同様の問題を解決しました(BimapSourcesのVSデバッグビジュアライザーを作成):読み取り/書き込みを行うシリアル化および逆シリアル化メソッドを実装します:

  • フォーマット(PixelFormat)
  • PixelHeight
  • PixelWidth
  • ストライド
  • バッファ

シリアライザーとデシリアライザーで使用CopyPixels(Int32Rect, IntPtr, Int32, Int32)します。
Create(Int32, Int32, Double, Double, PixelFormat, BitmapPalette, IntPtr, Int32, Int32)

残念ながら、私はソースコードを持っていませんが、実装は非常に簡単です。

于 2012-06-08T19:55:36.253 に答える
1

これは、DataContractにBitmapプロパティを追加し、サービス側でBitmapSourceからBitmapに変換し、それをネットワーク経由で送信し、Bitmapのパレットやその他のプロパティを使用してクライアント側でBitmapSourceを再構築することで解決されました。

于 2012-06-14T14:39:14.647 に答える