C#中如何调用ObjectToByteArray将结构体转字节数组?代码是否正确?
如何使用ObjectToByteArray将结构体转换为字节数组 & 代码检查
嘿,我来帮你梳理下这个问题~首先聊聊ObjectToByteArray方法的常见使用逻辑:这类方法大多基于.NET的对象序列化机制实现(最典型的是用BinaryFormatter,不过要注意这个类在现代.NET版本里已被标记为不安全,不推荐用于生产环境,但咱们先围绕你的需求展开)。它的核心作用就是把可序列化的对象(比如你的结构体)转换成字节数组,反过来也能把字节数组还原成对象。
接下来看你的代码,先指出几个关键问题,再给你修正后的版本:
你的代码里的核心问题
- 结构体缺少序列化标记:如果
ObjectToByteArray依赖标准序列化(比如BinaryFormatter),你的Convertor结构体必须加上[Serializable]特性,否则序列化时会直接抛出异常。 - ConvertToArray方法逻辑错误:你在方法里新建了一个空的
Convertor实例Result,但实际上你应该序列化当前结构体实例(也就是this),而不是一个空对象。
修正后的完整代码示例
// 必须添加Serializable特性,确保结构体可以被序列化 [Serializable] public struct Convertor { public string License { get; set; } public int Software { get; set; } public int StartDate { get; set; } public int EndDate { get; set; } public byte Count { get; set; } public int[] ActionCode { get; set; } public byte[] ConvertToArray() { // 调用ObjectToByteArray,传入当前实例this return ObjectToByteArray(this); } // 假设你的ObjectToByteArray是类似这样实现的(如果还没实现,参考这个) private static byte[] ObjectToByteArray(object obj) { if (obj == null) return null; using (var ms = new MemoryStream()) { var formatter = new BinaryFormatter(); formatter.Serialize(ms, obj); return ms.ToArray(); } } }
额外注意事项
- 关于BinaryFormatter的安全性:刚才提到了,
BinaryFormatter存在严重安全漏洞,如果你是在.NET Core/.NET 5+环境下开发,更推荐使用System.Text.Json、MessagePack或者Protobuf这类更安全、高效的序列化库。比如用System.Text.Json的话,代码可以改成这样:
这种方式不需要加public byte[] ConvertToArray() { return System.Text.Json.JsonSerializer.SerializeToUtf8Bytes(this); }[Serializable]特性,而且更安全。 - 字段的可序列化性:你的结构体里的字段类型(string、int、byte、int[])都是默认支持序列化的,所以只要标记了
[Serializable](用BinaryFormatter的话),就不会有问题。 - 结构体是值类型:要注意结构体是值类型,传递时会复制,但在这个场景里直接用
this序列化是完全没问题的。
内容的提问来源于stack exchange,提问作者Mishaa
相关产品推荐
相关产品推荐

