我需要将一个可观察的集合导出到二进制文件中。该文件将由嵌入式软件解析。
这是我的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在循环中编写我的类的每个属性,但我认为可能有一个更简单的解决方案。
谢谢!
答案 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 Buffers(Protocol Buffers)来回传输二进制数据。