2016-10-06 14 views
0

C#で固定バッファをシリアル化することは可能ですか?私は.netバイナリシリアル化を使用しています。これを克服するためにC#で固定バッファをシリアライズ

[Serializable] 
public unsafe struct MyStruct 
{ 
    public fixed int MyArray[10]; 
} 

、一つの選択肢は、固定バッファを無視して、プロパティを作成することでした。

[Serializable] 
public unsafe struct MyStruct 
{ 
    [field: NonSerialized] 
    public fixed int MyArray[10]; 

    public string MyArrayCsv 
    { 
     get { // populate string from array... } 
     set { // populate array from string... } 
    } 
} 

これは、XMLシリアル化に適していますが、バイナリシリアル化の特性を無視します。どのように固定バッファをバイナリシリアル化するための任意のアイデア?

+1

これは本当にシリアライザ、具体的な質問です。しかし、シリアライザが明示的に* 'fixed'バッファを考慮することはまれです。どのシリアライザを使用していますか?シリアライザを自由に選択できますか? –

+0

ISerializableを実装する必要があります。また、直列化されたデータ(プライベートconstを使用する)にも配列のサイズを含めることは危険です。 –

答えて

-1

なぜBinaryFormatterを使用しないのですか?ここ

しかしが可能である解決策(安全と危険な):

using System.IO; 
using System; 

public class UnsafeAndBinaryWriter 
{ 
    public unsafe static void Main(String[] args) 
    { 
     int[] arr = new int[] { 1, 2, 3, 4, 5 }; 
     Console.WriteLine("Hex buffer(unsafe): {0}", BitConverter.ToString(SerializeUnsafe(arr))); 
     Console.WriteLine("Hex buffer  : {0}", BitConverter.ToString(Serialize(arr))); 
    } 
    private static unsafe byte[] SerializeUnsafe(int[] arr) 
    { 
     int totalSize = arr.Length * sizeof(int); 
     byte[] resultBuffer = new byte[totalSize]; 
     // Of course you can do it without unsafe magic :) 
     fixed (int* p = (&arr[0])) { 
      byte* ptr = (byte*)p; 
      for (int i = 0; i < totalSize; i++, ptr++) 
       resultBuffer[i] = *ptr; 
     } 
     return resultBuffer; 
    } 
    private static byte[] Serialize(int[] arr) 
    { 
     byte[] resultBuffer = null; 
     // Stream for storing result 
     using (var stream = new MemoryStream()) { 
      using (BinaryWriter bw = new BinaryWriter(stream)) { 
       for (int i = 0; i < arr.Length; i++) 
        bw.Write(arr[i]); 
      } 
      resultBuffer = stream.ToArray(); 
     } 
     return resultBuffer; 
    } 
} 
関連する問題