我有一个需要写入二进制文件的对象集合。
我需要文件中的字节是紧凑的,所以我不能使用BinaryFormatter
。BinaryFormatter
为反序列化需求提供了各种信息。
如果我尝试
byte[] myBytes = (byte[]) myObject
我得到了一个运行时异常。
我需要速度快,所以我不想复制字节数组。我只希望byte[] myBytes = (byte[]) myObject
的角色能正常工作!
为了清楚起见,我不能在输出文件中包含任何元数据。只有对象字节。打包的对象到对象。根据收到的答案,看起来我将编写低级Buffer.BlockCopy
代码。也许使用了不安全的代码。
发布于 2012-05-09 00:47:25
要将对象转换为字节数组,请执行以下操作:
// Convert an object to a byte array
public static byte[] ObjectToByteArray(Object obj)
{
BinaryFormatter bf = new BinaryFormatter();
using (var ms = new MemoryStream())
{
bf.Serialize(ms, obj);
return ms.ToArray();
}
}
您只需将此函数复制到您的代码中,并将需要转换为字节数组的对象发送给它。如果您需要再次将字节数组转换为对象,可以使用以下函数:
// Convert a byte array to an Object
public static Object ByteArrayToObject(byte[] arrBytes)
{
using (var memStream = new MemoryStream())
{
var binForm = new BinaryFormatter();
memStream.Write(arrBytes, 0, arrBytes.Length);
memStream.Seek(0, SeekOrigin.Begin);
var obj = binForm.Deserialize(memStream);
return obj;
}
}
您可以将这些函数与自定义类一起使用。您只需在类中添加[Serializable]
属性即可启用序列化
发布于 2009-09-18 20:14:42
如果您希望序列化数据真正紧凑,您可以自己编写序列化方法。这样你就有了最小的开销。
示例:
public class MyClass {
public int Id { get; set; }
public string Name { get; set; }
public byte[] Serialize() {
using (MemoryStream m = new MemoryStream()) {
using (BinaryWriter writer = new BinaryWriter(m)) {
writer.Write(Id);
writer.Write(Name);
}
return m.ToArray();
}
}
public static MyClass Desserialize(byte[] data) {
MyClass result = new MyClass();
using (MemoryStream m = new MemoryStream(data)) {
using (BinaryReader reader = new BinaryReader(m)) {
result.Id = reader.ReadInt32();
result.Name = reader.ReadString();
}
}
return result;
}
}
发布于 2014-01-25 05:21:49
我采用了Crystalonics的答案,并将它们转换为扩展方法。我希望其他人会发现它们很有用:
public static byte[] SerializeToByteArray(this object obj)
{
if (obj == null)
{
return null;
}
var bf = new BinaryFormatter();
using (var ms = new MemoryStream())
{
bf.Serialize(ms, obj);
return ms.ToArray();
}
}
public static T Deserialize<T>(this byte[] byteArray) where T : class
{
if (byteArray == null)
{
return null;
}
using (var memStream = new MemoryStream())
{
var binForm = new BinaryFormatter();
memStream.Write(byteArray, 0, byteArray.Length);
memStream.Seek(0, SeekOrigin.Begin);
var obj = (T)binForm.Deserialize(memStream);
return obj;
}
}
https://stackoverflow.com/questions/1446547
复制相似问题