用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序列化同一个对象生成的文件长度不相上下。至于序列化所需的时间,相对于数据在网络中传输的时间,应该可以忽略不计,便不进行测试了。