C# 序列化性能优化

时间:2022-10-15 07:32:43
小弟初学C#,现在在公司尝试优化C#的序列化和反序列化模块(之前是使用protobuf实现的)
这个系统是这样的,分为客户端和服务器端,客户端是C#写的,服务器端是C++写的
C++传过来的是一个string (其实是从一个vector<uint8>转过来的,系统架构限制只能传string)
有如下几个问题,
1.我看了下相关文档,C#似乎有自己的序列化方法BinaryFormatter,不知道论坛里面是否有人用过,性能如何?
2.如果不用这种方法自己实现的话,存储数据结构是否考虑使用byte[]?
3.如果我改动系统架构,允许C++和C#中间直接传字节流的话,C++的vector<uint8>和BinaryFormatter是否能够无缝兼容?

10 个解决方案

#1


可以用C++写序列化和反序列化,然后暴露C接口, C#中用platform invoke调用C接口。

#2


C# 序列化性能优化

#3


引用 1 楼 findcaiyzh 的回复:
可以用C++写序列化和反序列化,然后暴露C接口, C#中用platform invoke调用C接口。

这么玩的话是否会有比较明显的性能损失?
由于这次改造希望能够将性能得到一个数量级的提升,所以希望能够在方案上将性能最优化

#4


BinaryFormatter效率不差,至少目前我用起来不觉得差,关键是我不用考虑算法什么的
存储数据到最后不都是二进制数据么,和类型有什么关系?
最后一个问题是你传的数据是已经序列化过的吗?如果是,那你要自己反序列化了。或者你是要对传过来的数据进行序列化,那可以直接用。

#5


c#序列化与c++序列化又不是一个东西。
c++传的序列化的东西c#也没有办法用。
再说了。所有的传输无论是什么都是字节流。

#6


C++那一块是我自己做的序列化,把数据序列化成了TLV格式,楼上是不是指BinaryFormatter会把数据序列化成自己的格式,如果是的话那只能我自己去手动序列化了

#7


BinaryFormatter的效率不算差阿,如果还想再提升速度是不是可以尝试把要序列化的类或数据进行拆分,然后用多线程去分别序列化。

#8


BinaryFormatter不算差阿
如果还想提升速度是不是可以尝试将要序列化的数据进行拆分,然后多线程去分别序列化。

#9


我查了下各位的讨论,看来这个BinaryFormatter我没法用,只能全部自己写,我的数据结构是否应该定义为
    class ByteStreamArchive : CollectionBase
把所有东西全都整到这个类里面去,然后再把它转成string或者byte出来?

#10


引用 6 楼 Richardicy 的回复:
C++那一块是我自己做的序列化,把数据序列化成了TLV格式,楼上是不是指BinaryFormatter会把数据序列化成自己的格式,如果是的话那只能我自己去手动序列化了

是滴

#1


可以用C++写序列化和反序列化,然后暴露C接口, C#中用platform invoke调用C接口。

#2


C# 序列化性能优化

#3


引用 1 楼 findcaiyzh 的回复:
可以用C++写序列化和反序列化,然后暴露C接口, C#中用platform invoke调用C接口。

这么玩的话是否会有比较明显的性能损失?
由于这次改造希望能够将性能得到一个数量级的提升,所以希望能够在方案上将性能最优化

#4


BinaryFormatter效率不差,至少目前我用起来不觉得差,关键是我不用考虑算法什么的
存储数据到最后不都是二进制数据么,和类型有什么关系?
最后一个问题是你传的数据是已经序列化过的吗?如果是,那你要自己反序列化了。或者你是要对传过来的数据进行序列化,那可以直接用。

#5


c#序列化与c++序列化又不是一个东西。
c++传的序列化的东西c#也没有办法用。
再说了。所有的传输无论是什么都是字节流。

#6


C++那一块是我自己做的序列化,把数据序列化成了TLV格式,楼上是不是指BinaryFormatter会把数据序列化成自己的格式,如果是的话那只能我自己去手动序列化了

#7


BinaryFormatter的效率不算差阿,如果还想再提升速度是不是可以尝试把要序列化的类或数据进行拆分,然后用多线程去分别序列化。

#8


BinaryFormatter不算差阿
如果还想提升速度是不是可以尝试将要序列化的数据进行拆分,然后多线程去分别序列化。

#9


我查了下各位的讨论,看来这个BinaryFormatter我没法用,只能全部自己写,我的数据结构是否应该定义为
    class ByteStreamArchive : CollectionBase
把所有东西全都整到这个类里面去,然后再把它转成string或者byte出来?

#10


引用 6 楼 Richardicy 的回复:
C++那一块是我自己做的序列化,把数据序列化成了TLV格式,楼上是不是指BinaryFormatter会把数据序列化成自己的格式,如果是的话那只能我自己去手动序列化了

是滴