- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我测试了 protobuf 序列化,似乎对于低于一定数量的对象,它比常规数据契约(Contract)序列化慢。使用 DataContractSerializer 的传输大小更大,但在序列化和反序列化期间使用 DataContractSerializer 更快
您认为这是正常的还是我弄错了?
[DataContract]
public partial class Toto
{
[DataMember]
public string NomToto { get; set; }
[DataMember]
public string PrenomToto { get; set; }
}
这是我的 datacontract 类,这与 protobuf 相同
[ProtoContract]
public partial class Titi
{
[ProtoMember(1)]
public string NomTiti { get; set; }
[ProtoMember(2)]
public string PrenomTiti { get; set; }
}
这是我使用 protobuf 的 WCF 服务的方法(对于没有 ms 的数据契约(Contract)也是如此)
public class TitiService : ITitiService
{
public byte[] GetAllTitis()
{
List<Titi> titiList = new List<Titi>();
for (int i = 0; i < 20000; i++)
{
var titi = new Titi
{
NomTiti = "NomTiti" + i,
PrenomTiti = "PrenomTiti" + i
};
titiList.Add(titi);
}
var ms = new MemoryStream();
Serializer.Serialize(ms, titiList);
byte[] arr = ms.ToArray();
return arr;
}
}
数据契约服务
public class TotoService : ITotoService
{
public List<Toto> GetAllTotos()
{
List<Toto> totoList = new List<Toto>();
for (int i = 0; i<20000; i++)
{
var toto = new Toto
{
NomToto = "NomToto" + i,
PrenomToto = "PrenomToto" + i
};
totoList.Add(toto);
}
return totoList;
}
}
这是客户电话
public partial class Program
{
static ProtobufTestAzure.Client.TitiService.TitiServiceClient TitiClient;
static ProtobufTestAzure.Client.TotoService.TotoServiceClient TotoClient;
public static void Main(string[] args)
{
Stopwatch stopwatch1 = new Stopwatch();
Stopwatch stopwatch2 = new Stopwatch();
Stopwatch stopwatch3 = new Stopwatch();
stopwatch1.Start();
TitiClient = new ProtobufTestAzure.Client.TitiService.TitiServiceClient();
Byte[] titiByte = TitiClient.GetAllTitis();
TitiClient.Close();
stopwatch1.Stop();
stopwatch2.Start();
var ms = new MemoryStream(titiByte);
List<Titi> TitiList = Serializer.Deserialize<List<Titi>>(ms);
stopwatch2.Stop();
Console.WriteLine(" ");
stopwatch3.Start();
TotoClient = new ProtobufTestAzure.Client.TotoService.TotoServiceClient();
var TotoList = TotoClient.GetAllTotos();
TotoClient.Close();
stopwatch3.Stop();
Console.WriteLine("Time elapse for reception (Protobuf): {0} ms ({1} éléments)", stopwatch1.ElapsedMilliseconds, TitiList.Count);
Console.WriteLine("Time elapse for deserialization (Protobuf : {0} ms ({1} éléments)", stopwatch2.ElapsedMilliseconds, TitiList.Count);
Console.WriteLine("Time elapse for réception (Datacontract Serialization) : {0} ms ({1} éléments)", stopwatch3.ElapsedMilliseconds, TotoList.Count);
Console.ReadLine();
}
}
以及 10000 个对象的结果
接收时间 (Protobuf):3359 毫秒(10000 个元素)反序列化时间 (Protobuf):138 毫秒(10000 个元素)接收时间(数据契约(Contract)序列化):2200 毫秒(10000 个元素)
我用 20000 个对象测试它它给了我第一个电话
接收时间 (Protobuf):11258 毫秒(20000 个元素)反序列化耗时 (Protobuf):133 毫秒(20000 个元素)接收时间(Datacontract 序列化):3726ms(20000 个元素)
第二次调用
接收时间 (Protobuf):2844 毫秒(20000 个元素)反序列化时间 (Protobuf):141 毫秒(20000 个元素)接收时间(Datacontract 序列化):7541 毫秒(20000 个元素)
第三个
接收时间 (Protobuf):2767 毫秒(20000 个元素)反序列化时间 (Protobuf):145 毫秒(20000 个元素)接收时间(Datacontract 序列化):3989 毫秒(20000 个元素)
在“Protobuf transfert”上激活 MTOM 后,它给了我:
第一次通话
接收时间 (Protobuf):3316 毫秒(20000 个元素)反序列化时间 (Protobuf):63 毫秒(20000 个元素)接收时间(数据契约(Contract)序列化):3769 毫秒(20000 个元素)
第二次调用
接收时间 (Protobuf):2279 毫秒(20000 个元素)反序列化时间 (Protobuf):57 毫秒(20000 个元素)接收时间(数据契约(Contract)序列化):3959 毫秒(20000 个元素)
我为对象大小添加了这部分代码
long totoSize = new long();
using (Stream s = new MemoryStream())
{
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(s, totoList);
totoSize = s.Length;
}
long titiSize = titiByte.Count();
它给了我 637780 with protobuf 和 1038236 with DataContractSerializer今天早上的通话时间更好更稳定第一次打电话protobuf = 2498 毫秒数据契约(Contract) = 5085 毫秒
第二次通话protobuf = 3649 毫秒数据契约(Contract) = 3840 毫秒
第三次通话protobuf = 2498 毫秒数据契约(Contract) = 5085 毫秒
最佳答案
一些影响性能的因素:
Serializer.PrepareSerializer<YourType>()
来抵消它启动期间的某个地方
byte[]
已编码(当然,这在套接字上不是问题);例如,传输可以使用 MTOM 吗?还是 base-64 编码 byte[]
?
Stream
是可能的和 byte[]
处理方式不同;如果你可以测量带宽,你可能想尝试两者关于c# - WCF 上 protobuf-net 与 DataContractSerializer 的性能对比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5787844/
尝试返回一个时出现以下错误向客户提出问卷调查对象。我按照建议在数据协定中添加了 KnowType[typeof(...)],但它仍然不起作用。不知道序列化程序不知道哪种类型,我只是放入了 EF 模型中
我们有一个带有对象的应用程序,我们希望该对象在数据库中保持序列化。 当前,我们正在使用NetDataContractSerializer,但是最近发现,由于涉及到.Net类型信息,它创建了巨大的文件,
我正在阅读微软的 Best Practices: Data Contract Versioning ,他们说: Do not remove data members in later versions
我正在编写一个将由 Silverlight 应用程序使用的 WCF 应用程序。我已经完成了大部分的设计工作,我现在正在做实现,这让我想出了这个问题。 这是我的应用程序中存在的内容的示例: [DataC
我正在使用 DataContractSerializer 来存储我自己的类的对象以保存用户设置。 UserSettings 类使用其他一些不同数据类型的对象。我将所有这些类型添加到 DataContr
当我有以下类并尝试使用 DataContractSerializer 序列化 ConcreteClass 实例时.WriteObject(..) 我收到一个 InvalidDataContractEx
我有 50 个标有 DataContractAttribute 的类。 这些类形成了一个巨大的层次树,使用DataContractSerializer将其序列化/反序列化为xml。 除了我遗漏的 3
以下程序尝试从层次结构中序列化然后反序列化通用类型的对象,失败并出现代码下方列出的错误。 如何让它发挥作用? 代码: [DataContract] [KnownType(nameof(GetKnown
我遇到了一个关于数据协定序列化程序的非常愚蠢的问题。它拒绝工作。我只是想将一个对象序列化为一个 XmlDocument,但我似乎碰壁了。 以下是我希望序列化的数据契约(Contract): [Data
我在代码中序列化一个对象(不是通过 WCF 调用),并且我对已知类型有点着迷(我已经将它们与 WCF 一起使用,但没有将 DataContract 序列化程序作为“独立”序列化器) 当我运行下面的代码
我想使用 DataContractSerializer,但我对 WriteObject 方法中的 Stream 参数感到困惑 - 我知道我可以使用 MemoryStream 或 XmlWriter。我
这里有一些说明问题的测试代码: 编译配置: 公共(public)语言运行时支持:/clr C++ 语言 错误信息: 错误 4 错误 C2065:“DataContractSerializer”:未声明
我在反序列化 xml 文件中的列表时遇到问题。我的属性是内部的,所以我使用的是 datacontractserializer 而不是 xmlserializer。 我的xml如下
我注意到,如果我使用 Datacontractserializer 将对象持久化回文件中,如果新 xml 的长度比文件中最初存在的 xml 短,则原始 xml 的剩余部分会超过新 xml 的长度将保留
我正在使用 DataContractSerializer 将 xml 反序列化为列表。 xml结构如下: Attributes 类有 3 个通过属性引用的字符串数据成员,它们是: [Da
我正在从以 XML 形式返回 XML 的 restful 服务中提取数据 param1 value param2 value param1 value
我正在使用 HttpClient 将 xml 发布到休息服务。问题是服务需要命名空间前缀,而我无法使用 DataContractSerializer 实现。 预期的 xml:
我使用 DataContract 序列化程序来序列化我的数据。我使用 PreserveObjectReferences = true 因为我需要它。例如,我有两个对象: [Datacontract]
当使用 DataContractSerializer 反序列化 XML 时,我遇到了基类序列的问题。没有派生类从 XML 中反序列化:
最近,当我阅读 DataContractSerializer 的默认行为时,我得到了 rules来自 MSDN,但是我不明白我提取的第一条规则如下: The DataContractSerialize
我是一名优秀的程序员,十分优秀!