2016-10-10 1 views
0

私は観測可能なコレクションをバイナリファイルにエクスポートする必要があります。このファイルは埋め込みソフトウェアによって解析されます。クラスをバイナリファイルにエクスポートするには

これは、LEDの構成の私のクラスである:

[XmlRoot("ConfLed")] 
public class LedVals 
{ 
    #region Properties 
    [XmlAttribute] 
    public int ID { get; set; } 

    [XmlAttribute] 
    public string Type { get; set; } = "Trigger"; 

    [XmlAttribute] 
    public string Binding { get; set; } = "OFF"; 

    [XmlAttribute] 
    public int Trigger1 { get; set; } = 0; 

    [XmlAttribute] 
    public int Trigger2 { get; set; } = 0; 

    [XmlAttribute] 
    public string ColorT0 { get; set; } = "#000000"; 

    [XmlAttribute] 
    public string ColorT1 { get; set; } = "#000000"; 

    [XmlAttribute] 
    public string ColorT2 { get; set; } = "#000000"; 

    #endregion 

    public LedVals() 
    { 

    } 

    public LedVals(int idParam, string typeParam, string bindingParam, int trig1Param, int trig2Param, string c0Param, string c1Param, string c2Param) 
    { 
     this.ID = idParam; 
     this.Type = typeParam; 
     this.Binding = bindingParam; 
     this.Trigger1 = trig1Param; 
     this.Trigger2 = trig2Param; 
     this.ColorT0 = c0Param; 
     this.ColorT1 = c1Param; 
     this.ColorT2 = c2Param; 
    } 
} 

そして、これは私がエクスポートする必要がLedValsクラスの監視可能なコレクション(ListeLedTable)のための私のシリアル化機能である:

public void SerializeLedTable(string filePathParam) 
    { 
     try 
     { 
      using (Stream mstream = File.Open(filePathParam + ".bin", FileMode.Create)) 
      { 
       BinaryFormatter bin = new BinaryFormatter(); 
       bin.Serialize(mstream, ListeLedTable); 
      } 
     } 
    } 

結果は、観察可能なコレクション構造のクラスプロパティとテキスト記述のバイナリ値を持つファイルです。

このようなクラスのプロパティ値を書き出す方法はありますか?

私は、ループ内で自分のクラスの各プロパティを書き込むためにbinaryWriterを使うことができますが、もっと簡単な解決法があると思いました。

ありがとうございました!

答えて

1

使用元帥のテクニック:

class Program 
    { 
     static void Main(string[] args) 
     { 
      LedVals ledVals = new LedVals(); 
      int size = Marshal.SizeOf(ledVals); ; 
      IntPtr ptr = Marshal.AllocHGlobal(size); 
      byte[] buffer = new byte[Marshal.SizeOf(ledVals)]; 
      Marshal.StructureToPtr(ledVals, ptr, true); 
      Marshal.Copy(ptr, buffer, 0, Marshal.SizeOf(ledVals)); 
      Marshal.FreeHGlobal(ptr); 
      FileStream stream = File.OpenWrite("FILENAME"); 
      BinaryWriter bWriter = new BinaryWriter(stream, Encoding.UTF8); 
      bWriter.Write(buffer); 

     } 

    } 
    [StructLayout(LayoutKind.Sequential)] 
    public class LedVals 
    { 
     public int ID { get; set; } 
    } 
+0

Marshal例外が発生しました.Marshal.SizeOfは管理対象オブジェクトのサイズを取得できません。 – Alexus

+0

クラスLedValsの定義の前に追加します。[StructLayout(LayoutKind.Sequential)]。 – jdweng

+0

ファイルを必要としない場合は、代わりにMemoryStreamを使用できます。 – jdweng

0

すべてのinteropに.NETバイナリシリアル化を使用することは悪い考えです。

XMLはより良い選択かもしれませんが、組み込みデバイスは通常、XML処理を実行するのに必要な能力がありません。あなたの組み込みプラットフォームが何であるか分かりませんが、Protocol BuffersProtocol Buffers)を使用してバイナリデータを前後に転送できる可能性があります。

+0

それは悪い考えではありません。これは、dllに送受信するときに常に使用されます。 – jdweng

関連する問題