0

メモリ バッファにシリアライズしたいオブジェクトがあり、UART 経由で組み込みデバイスに送信されます。WindowsのC#環境で作業しています。

私がやりたいのは、次のような 2 つのクラスを作成することです。

class StatusElement
{
    byte statusPart1;
    byte statusPart2;
}

class DeviceCommand
{
    byte Address;
    byte Length;
    StatusElement[] statusElements; // Can have an arbitrary number of elements in it
}

2 番目のクラスをバイト ストリームに変換するために、シリアル化、できれば C# シリアル化に基づくものを使用したいと思います。

問題は、組み込みデバイスが正確なシーケンス (AddressByte、LengthByte .... ErrorCorrectionByte) を受け入れるようにハードコードされているため、ストリームにシリアル化メタデータを追加する通常の C# シリアル化を使用できないことです。これにより、Protobuf などの他のシリアル化も除外されます。

だから私の質問は: 必要な出力を得るために c# のシリアル化をカスタマイズすることは可能ですか? どのように?

- - アップデート - -

助けてくれてありがとう。検討の結果、リフレクションと型ごとのハンドラーを使用して、独自のミニシリアライザーを実装することにしました。より複雑ですが、柔軟性と自動化機能が向上します。

4

2 に答える 2

1

a を使用しMemoryStreamて、オブジェクトを手動でシリアル化します。

private byte[] Serialize()
{
    using (var ms = new MemoryStream())
    {
        ms.WriteByte(Address);
        ms.WriteByte(Length);
        foreach (var element in statusElements)
        {
            ms.WriteByte(element.statusPart1);
            ms.WriteByte(element.statusPart2);
        }
        return ms.ToArray();
    }
}

逆シリアル化についても同様です。

private static DeviceCommand Deserialize(byte[] input)
{
    DeviceCommand result = new DeviceCommand();
    using (var ms = new MemoryStream(input))
    {
        result.Address = ms.ReadByte();
        result.Length = ms.ReadByte();

        //assuming .Length contains the number of statusElements:
        result.statusElemetns = new StatusElement[result.Length];
        for (int i = 0; i < result.Length; i++)
        {
            result.statusElements[i] = new StatusElement();
            result.statusElements[i].statusPart1 = ms.ReadByte();
            result.statusElements[i].statusPart2 = ms.ReadByte();
        }
    }
    return result;
}
于 2012-08-12T13:41:26.450 に答える
0

バイトまたはバイト配列のみを書き込む必要がある場合は、MemoryStream を直接使用できます。他の .NET ベース タイプを使用する場合は、System.IO.BinaryWriter / BinaryReader を使用してストリームにアクセスします。このクラスは、バイナリのシリアル化と逆シリアル化のために System.Runtime.Serialization.Formatters.Binary.BinaryFormatter によって使用されます。

于 2012-08-12T14:15:42.847 に答える