1

私が持っているオブジェクトをオブジェクトに変換しようとしてbyte[]います。オンラインで見つけたこのコードを使用してみました:

object byteArrayToObject(byte[] bytes)
    {
        try
        {
            MemoryStream ms = new MemoryStream(bytes);
            BinaryFormatter bf = new BinaryFormatter();
            //ms.Position = 0;
            return bf.Deserialize(ms,null);
        }
        catch
        {
            return null;
        }
    }

SerializationException: "解析が完了する前にストリームの終わりが検出されました。".

ms.Position = 0もちろん、コメントを外し た行でも試してみました...bytes[]長さはわずか8バイトで、各バイトはnull.

提案?

[編集]

byte[] は、次の行に沿って何かを使用して、C++ プログラムからバイナリ ファイルに書き込まれました。

void WriteToFile (std::ostream& file,T* value)
{
    file.write(reinterpret_cast<char*>(value), sizeof(*T))
}

value には、さまざまなタイプを指定できます。BitConverter を使用してファイルからいくつかのオブジェクトにキャストできますが、BitConverter がカバーしていないものはすべてできません..

4

1 に答える 1

0

cdhowie が述べたように、エンコードされたデータを手動で逆シリアル化する必要があります。利用可能な限られた情報に基づいて、オブジェクトの配列または配列を含むオブジェクトのいずれかが必要になる場合があります。単一の long があるように見えますが、コードから知る方法はありません。オブジェクトを本来の形で再作成する必要があるため、以下の myLong を単一の long 配列の簡単な例として取り上げます。指定されていないため、次のような配列を含む構造体が必要であると想定します。

public struct myLong {
    public long[] value;
}

構造体の配列、または以下に掲載されているコードに小さな変更を加えたクラスで同じことを行うことができます。

メソッドは次のようになります: (エディタで記述)

private myLong byteArrayToObject(byte[] bytes) {
    try
    {
        int len = sizeof(long);
        myLong data = new myLong();
        data.value = new long[bytes.Length / len];
        int byteindex = 0;
        for (int i = 0; i < data.value.Length; i++) {
           data.value[i] = BitConverter.ToInt64(bytes,byteindex);
           byteindex += len;
        }            
        return data;
    }
    catch
    {
        return null;
    }
}
于 2013-02-19T21:15:32.000 に答える