如何在二进制文件中导出类

时间:2016-10-10 09:37:06

标签: c#

我需要将一个可观察的集合导出到二进制文件中。该文件将由嵌入式软件解析。

这是我的Led配置类:

public bool SetData(List<Serialized> lstSerialized)
{
    string query = "IF NOT EXISTS(SELECT Fid from table1 where Fid=@Fid)" +
                "INSERT INTO table1(" +
                "id, " +
                "Name, " +
                "Fid ,"+                     
                "Detail) OUTPUT INSERTED.id VALUES (" +
                "@id, " +
                "@Name, " +
                "@Fid )"+
               "@Detail)"+
                "ELSE UPDATE table1 SET Name= @Name,Detail= @Detail WHERE Fid = @Fid ";

    return Data.CreateSerialized(lstSerialized, query);
}

public bool CreateSerialized(List<Serialized> lstSerialized, string query)
{
    try
    {
        int Id=0;

        using (SqlConnection con = new SqlConnection(conString))
        {
            using (SqlCommand cmd = new SqlCommand(query, con))
            {
                int id = GetMaxid();
                cmd.CommandType = CommandType.Text;
                cmd.Parameters.Add("@id", SqlDbType.NVarChar).Value = id
                cmd.Parameters.Add("@Name", SqlDbType.NVarChar).Value = lstSerialized[0].Name;
                cmd.Parameters.Add("@Detail", SqlDbType.NVarChar).Value = lstSerialized[0].Detail;
                cmd.Parameters.Add("@Fid ", SqlDbType.Int).Value = lstSerialized[0].Fid;

                con.Open();

                Id= (int)cmd.ExecuteScalar();

                con.Close();
            }

            if (Id!=0)
            {
                using (SqlCommand command = new SqlCommand("update [table2] " +
                                                    "set Index=" + Id + " where " +
                                                    "[IndexID] = " + 9, con))
                {
                    con.Open();
                    int rowsAffected = command.ExecuteNonQuery();
                    con.Close();
                }
            }
        }
    }
    catch (Exception ex)
    {
        return false;
    }
    return true;
}

这是我需要导出的LedVals类(ListeLedTable)的可观察集合的序列化函数:

OnBeforeExit

结果是一个文件,其中包含类属性的二进制值和可观察集合结构的文本描述。

有没有办法导出像这样的类的属性值?

我可以使用binaryWriter在循环中编写我的类的每个属性,但我认为可能有一个更简单的解决方案。

谢谢!

2 个答案:

答案 0 :(得分: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; }
    }

答案 1 :(得分:0)

对任何互操作使用.NET二进制序列化是一个坏主意。

XML可能是更好的选择,但嵌入式设备通常缺乏执行任何XML处理所需的功能。我不知道您的嵌入式平台是什么,但您可以使用Protocol BuffersProtocol Buffers)来回传输二进制数据。