BinaryFormatter
과 Protobuf-net 시리얼 라이저 사이의 약간의 비교를하고 있었는데 나는 내가 found인데 상당히 기뻤지 만, Protobuf-net은 객체를 내가 사용한다면 얻을 수있는 것보다 작은 바이트 배열로 직렬화 할 수 있었다. 모든 속성의 값을 메타 데이터없이 바이트 배열에 썼습니다. 그래서 Protobuf-NET은 기본적으로 약간의 압축을 제공합니까, Protobuf-net에는 직렬화를위한 빌드 인 압축 기능이 있습니까?
true
에
AsReference
를 설정하면 Protobuf-NET 지원 문자열 인턴 알지만,이 경우에 것을 안할거야?
var simpleObject = new SimpleObject
{
Id = 10,
Name = "Yan",
Address = "Planet Earth",
Scores = Enumerable.Range(1, 10).ToList()
};
using (var memStream = new MemoryStream())
{
var binaryWriter = new BinaryWriter(memStream);
// 4 bytes for int
binaryWriter.Write(simpleObject.Id);
// 3 bytes + 1 more for string termination
binaryWriter.Write(simpleObject.Name);
// 12 bytes + 1 more for string termination
binaryWriter.Write(simpleObject.Address);
// 40 bytes for 10 ints
simpleObject.Scores.ForEach(binaryWriter.Write);
// 61 bytes, which is what I expect
Console.WriteLine("BinaryWriter wrote [{0}] bytes",
memStream.ToArray().Count());
}
using (var memStream = new MemoryStream())
{
ProtoBuf.Serializer.Serialize(memStream, simpleObject);
// 41 bytes!
Console.WriteLine("Protobuf serialize wrote [{0}] bytes",
memStream.ToArray().Count());
}
편집 : 여기
당신이 직접보고하기 위해 실행할 수있는 몇 가지 코드의 추가하려면 SimpleObject 클래스는 다음과 같습니다 없다 깜빡 :[Serializable]
[DataContract]
public class SimpleObject
{
[DataMember(Order = 1)]
public int Id { get; set; }
[DataMember(Order = 2)]
public string Name { get; set; }
[DataMember(Order = 3)]
public string Address { get; set; }
[DataMember(Order = 4)]
public List<int> Scores { get; set; }
}
감사합니다. 이제는 모두 의미가 있습니다! – theburningmonk
protobuf가 128 값에 대해서만 1 바이트를 만드는 이유는 무엇입니까? 8 비트로 256 개의 서로 다른 값을 쓸 수 있습니다. – tobi
@tobi 필드 번호에 대해 "varint"인코딩을 사용합니다. 이는 7 비트 페이로드를 의미하고 1 비트는 "읽을 다른 바이트가 있습니다"라는 의미입니다. MSB가 0이 될 때까지 계속 읽습니다. –