3

ネットワークのトラフィックを減らすために、 の代わりに protobuf-net を使用したいのですがBinaryFormatter、次のエラーが発生しました。

No serializer defined for type: System.Drawing.Color

WB メッセージ:

[ProtoContract]
[Serializable]
public abstract class WBMessage
{
    [ProtoMember(1)]
    public Color setColor1;

    [ProtoMember(2)]
    public UInt16 userNo;

    public abstract WHITEBOARD_MESSAGE_TYPE MessageType
    {
        get;
    }

    [ProtoMember(3)]
    public string age;

    public enum WHITEBOARD_MESSAGE_TYPE
    {
        enWBBegin,
        enWBLine,
        enWBRectangle,
        enWBRectangleF,
        enWBEllipse,
        enWBEllipseF,
        enWBClearScreen,
        enWBText,
        enWBEnd
    };
}

WBMsgDrawBegin:

[ProtoContract]
[ProtoInclude(1, typeof(WBMessage))]
public class WBMsgDrawBegin : WBMessage
{
    private const WHITEBOARD_MESSAGE_TYPE m_enMsgType =   WHITEBOARD_MESSAGE_TYPE.enWBBegin;
    public override WHITEBOARD_MESSAGE_TYPE MessageType
    {
        get
        {
            return m_enMsgType;
        }
    }

    [ProtoMember(4)]
    public int x;

    [ProtoMember(5)]
    public int y;

    [ProtoMember(6)]
    public bool m_bMouseDown;

    [ProtoMember(7)]
    public string name;
}

使用法:

WBMsgDrawBegin item1 = new WBMsgDrawBegin();
item1.setColor1 = Color.AliceBlue;
item1.name = "test";
item1.age = "31";

item1.x = 10998;
item1.y = 10089;

Stream stream = new MemoryStream();
MemoryStream ms = new MemoryStream();
Serializer.SerializeWithLengthPrefix<WBMsgDrawBegin>(ms, item1, PrefixStyle.Base128, 0);
4

3 に答える 3

4

すべてのプラットフォームでサポートされていない、特にグラフィックライブラリなどの既知のすべてのBCLタイプを処理することを保証するものではありません。私がお勧めします:

public Color Foo {get;set;}

[ProtoMember(n, DataFormat=DataFormat.Fixed)]
private int FooSerialized {
    get { return Foo.ToArgb(); }
    set { Foo = Color.FromArgb(value); }
}

これにより、固定の4バイトのチャンクとしてシリアル化されます。色のプロパティがたくさんある場合は、「サロゲート」を使用して非常によく似た処理を行うこともできます(コードは少なくなりますが、アイテムごとに2バイト余分になります)。

于 2012-06-10T08:41:39.033 に答える
2

それで、質問は何ですか?

組み込みカラー クラスのシリアライザーはありません。

ネットワーク経由で色を伝えたい場合は、ARGB の 32 ビット整数を送信するなど、他の表現で行う必要があります。これは、色のかなり一般的な方法です。

色を伝える標準的な方法はたくさんあります。ただし、独自の方法を定義しようとするのではなく、標準的な方法に固執することをお勧めします。32 ビット整数または 4 バイト ARGB に固執してください。

于 2012-06-10T06:07:44.897 に答える