嵌入式设备二进制序列化包的关注点分离方案咨询
嵌入式设备二进制序列化包收发:访问者模式方案咨询
我需要与嵌入式设备进行二进制序列化包的收发,核心要求是完全控制序列化过程、字节序(endian-ness)以及序列化数据中属性的顺序。
我梳理了几种可行的实现方案:
1. 基础实现:包类内直接实现序列化方法
在包类中直接编写Serialize和Deserialize方法,示例代码如下:
class MyPackage { public int PackageId { get; set; } public float SomeValue { get; set; } public void Serialize(BinaryWriter writer) { writer.Write(PackageId); writer.Write(SomeValue); } public void Deserialize(BinaryReader reader) { PackageId = reader.ReadInt32(); SomeValue = reader.ReadSingle(); } }
这种方式的问题在于不符合关注点分离原则,如果后续需要支持其他序列化格式,每个包类都要新增对应的方法,维护成本会越来越高。
2. 分离序列化逻辑到独立类
将序列化/反序列化逻辑抽离到单独的类中,示例代码如下:
class MyPackage { public int PackageId { get; set; } public float SomeValue { get; set; } } class MyBinaryPackageSerializer { void Serialize(MyPackage package, BinaryWriter writer) { writer.Write(package.PackageId); writer.Write(package.SomeValue); } MyPackage Deserialize(BinaryReader reader) { var result = new MyPackage(); result.PackageId = reader.ReadInt32(); result.SomeValue = reader.ReadSingle(); return result; } }
该方案实现了关注点分离,同时仍能完全控制序列化的字节序和属性顺序。但缺点也很明显:每个包类型需要对应一个序列化类,新增属性时容易遗漏序列化逻辑(不过这一点也可以作为与嵌入式端同步的校验机制)。
3. 反射+属性标注
通过反射遍历属性,并结合自定义属性指定序列化顺序。但这种方案存在两个问题:一是属性与序列化器强绑定,灵活性不足;二是反射会带来性能损耗,在对性能敏感的场景下不太适用。
4. 访问者模式方案
考虑使用访问者模式,让所有包类接受访问者并传递自身属性。虽然部分逻辑会回到包类中,但这种方案支持创建多种访问者(比如不同格式的序列化器、校验器等)。
我认为访问者模式是当前场景下的最优选项,想咨询该方案的具体建议及需要注意的事项。
内容的提问来源于stack exchange,提问作者Bas Visscher
相关产品推荐
相关产品推荐

