.NET远程处理(Remoting)与WCF的性能对比

来源:岁月联盟 编辑:exp 时间:2012-02-05
用TCP信道时,.NET远程处理默认的序列化器是System.Runtime.Serialization.Formatters.Binary.BinaryFormatter。WCF是用SOAP传送消息的,即格式是XML。可以设置XML的编码方式,选择编码为文本或二进制数据。下面测试用BinaryFormatter和WCF的序列化器序列化同一个对象时,哪一个产生的二进制流最短。
 
class Program 
   { 
       static void Main(string[] args) 
       { 
           Customer customer = new Customer { Age = 30, FirstName = "Gqq", LastName = "Nb" }; 
 
 
           using (FileStream stream1 = new FileStream(@"B:/binaryFormatter.bin", FileMode.Create)) 
           { 
               BinaryFormatter binFormatter = new BinaryFormatter(); 
               binFormatter.Serialize(stream1, customer); 
           } 
 
           using (FileStream stream2 = new FileStream(@"B:/xmlFormatter.bin", FileMode.Create)) 
           { 
               var serializer = new DataContractSerializer(typeof(Customer)); 
               XmlDictionaryWriter binaryWriter = XmlDictionaryWriter.CreateBinaryWriter(stream2); 
               serializer.WriteObject(binaryWriter, customer); 
               binaryWriter.Close(); 
           } 
       } 
   } 
 
   [DataContract] 
   [Serializable] 
   class Customer 
   { 
       private string fn; 
 
       [DataMember] 
       public string FirstName 
       { 
           get { return fn; } 
           set { fn = value; } 
       } 
 
       private string ln; 
 
       [DataMember] 
       public string LastName 
       { 
           get { return ln; } 
           set { ln = value; } 
       } 
 
       private int age; 
 
       [DataMember] 
       public int Age 
       { 
           get { return age; } 
           set { age = value; } 
       } 
   } 
 
在这种情况下,BinaryFormatter生成的binaryFormatter.bin大小为173字节,XmlDictionaryWriter生成的xmlFormatter.bin大小为183字节。BinaryFormatter以微弱优势胜出。
然而,如果把Customer里的属性全改为自动属性,则BinaryFormatter生成的binaryFormatter.bin增加至237字节,XmlDictionaryWriter生成的xmlFormatter.bin大小不变。这是因为BinaryFormatter记录的是后备字段的名字和值。用自动属性时,FirstName的后备字段是<firstname>k__BackingField,比较长罢了。
 
所以我认为BinaryFormatter和XmlDictionaryWriter序列化同一个对象生成的文件长度不相上下。至于序列化所需的时间,相对于数据在网络中传输的时间,应该可以忽略不计,便不进行测试了


作者 gqqnb的专栏