0

byte[]いくつかの構造とその表現の間でいくつかの変換を行っています。これを行う 2 つの方法を見つけましたが、違い (パフォーマンス、メモリなど) は明確ではありません。

方法 1:

public static T ByteArrayToStructure<T>(byte[] buffer)
{    
    int length = buffer.Length;
    IntPtr i = Marshal.AllocHGlobal(length);
    Marshal.Copy(buffer, 0, i, length);
    T result = (T)Marshal.PtrToStructure(i, typeof(T));
    Marshal.FreeHGlobal(i);
    return result;
}

方法 2:

public static T Deserialize<T>(byte[] buffer)
{
    BinaryFormatter formatter = new BinaryFormatter();
    using (System.IO.MemoryStream stream = new System.IO.MemoryStream(buffer))
    {
        return (T)formatter.Deserialize(stream);
    }
}

どちらが優れており、主な違いは何ですか?

4

2 に答える 2

2

あなたは2つの異なるアプローチと2つの異なるタイプのデータについて話している. バイト配列に変換された生の値を使用している場合は、最初の方法を使用してください。バイト配列にシリアル化された値 (シリアル化データも含まれる) を扱う場合は、2 番目の方法を使用してください。2 つの異なる状況、2 つの異なる方法...それらは「同義語」ではありません。

Int32 Serialized into Byte[] -> Length 54
Int32 Converted to Byte[]    -> Length 4
于 2013-01-18T17:43:22.797 に答える
1

を使用しBinaryFormatterてデータをシリアライズすると、デシリアライズ中に使用するために出力ストリームにメタ データが追加されます。Tしたがって、あなたが持っている2つの例では、同じ入力が与えられても同じ出力が生成されないことがわかりbyte[]ます。したがって、バイナリ出力のメタデータを気にするかどうかを決定する必要があります。気にしない場合は、方法 2 の方が明らかにクリーンです。ストレート バイナリにする必要がある場合は、方法 1 のようなものを使用する必要があります。

于 2013-01-18T17:21:54.953 に答える