日期:2014-05-18  浏览次数:20811 次

如何将对象转化为二进制字节流?
现在在写一个程序,在C#和Linux下C语言平台之间通信。现在要将C#的对象中的成员变量转换成二进制字节流,然后传递给C那边直接赋给结构体(也就是说不能有多余的数据)。
我原本打算是在每一个类里头都写一个函数,将成员变量一个一个转换成byte[],然后用通信模块调用传递出去,但是类很多,一个一个写很麻烦。
后来想到反射机制去写、或者用序列化的方式,但是对这两者都不是很熟悉。
疑问:如果用序列化去写,得到的二进制数据中有是没有多余的数据的吗?是不是还是要在每一个类里面重写一个序列化的函数?而如果还是要在每个类里头都写,那能不能用反射机制实现这个过程?
谢谢各位大侠。

------解决方案--------------------
你如果想写一个通用的序列化,恐怕很难,最初java也有类似想法,但后来实现起来效率极低,因为有很多引用类型,它们可能引用同一个对象,而且还有很多成员不需要序列化,

所以你最好还是对每个类写一个序列化方法,你可以决定对哪些成员序列化,哪些不用序列化,对引用类型也可以按语义进行适当处理,

------解决方案--------------------
序列化,可以写成通用的
C# code

        public bool Serialize<T>(T value, string filename)
        {
            try
            {
                System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bs = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
                System.IO.FileStream stream = new System.IO.FileStream(filename, System.IO.FileMode.Create);
                bs.Serialize(stream, value);
                stream.Close();
                return true;
            }
            catch
            {
                return false;
            }
        }

------解决方案--------------------
为何不用Xml格式传输数据。
------解决方案--------------------
c#序列化的数据,c反序列化能识别吗?
我觉得通过json来传递数据会更加方便