0

ファイルにシリアライズしたいシーケンシャル構造体がありますが、これは些細なことのようです。ただし、この構造体は、とりわけ、他のタイプの構造体の 2 つの配列で構成されています。主な構造体は次のように定義されています...

    [StructLayout(LayoutKind.Sequential)] 
    public struct ParentStruct
    {
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
        public const string prefix = "PRE";
        public Int32 someInteger;
        public DataLocater[] locater; //DataLocater is another struct
        public Body[] body; //Body is another struct
    };

これらの構造体を意図したとおりに作成できます。ただし、次の方法 (オンラインで人気があるようです) でシリアル化しようとすると、AccessViolationException が発生します。

    public static byte[] RawSerialize(object structure)
    {
        int size = Marshal.SizeOf(structure);
        IntPtr buffer = Marshal.AllocHGlobal(size);
        Marshal.StructureToPtr(structure, buffer, true);
        byte[] data = new byte[size];
        Marshal.Copy(buffer, data, 0, size);
        Marshal.FreeHGlobal(buffer);
        return data;
    }

これは、構造体が配列の大きさを正確に定義していないため、事前にサイズを明示的に決定できないためだと思いますか? それを取得できないため、構造体に適切な量のスペースを割り当てておらず、構造体をポインターにキャストするときに短すぎてしまうようです。これについてはよくわかりません。なぜこれが発生する可能性があり、可能な代替手段は何ですか?

編集:エラーをスローしている行は

Marshal.StructureToPtr(structure, buffer, true);
4

2 に答える 2

1

構造体配列がネストされているため、不可能です。他の構造体の配列を含む構造体を使用しようとすると、例外が発生するを参照してください。どうしたの?.

于 2009-09-28T15:10:19.723 に答える
0

C#では、ISerializableを実装し、BinaryFormatterクラスを使用して構造体をディスクに書き込む方が理にかなっています。

ISerializable

于 2009-09-28T15:03:34.540 に答える