using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
namespace test_protosharp
{
[Serializable]
[ProtoBuf.ProtoContract]
public class MyClass
{
[ProtoSharp.Core.Tag(1)]
[ProtoBuf.ProtoMember(1)]
public int MessageType { get; set; }
[ProtoSharp.Core.Tag(2)]
[ProtoBuf.ProtoMember(2)]
public string Message { get; set; }
}
class Program
{
private static List<MyClass> _forSerialize;
static void Main()
{
_forSerialize = new List<MyClass>
{
new MyClass {MessageType = 0, Message = "Test1"},
new MyClass {MessageType = 1, Message = "Test2"},
new MyClass {MessageType = 2, Message = "Test3"},
new MyClass {MessageType = 3, Message = "Test4"}
};
// Test BinaryFormatter Serializer
using (Stream fs = File.Create("test.bin"))
{
BinaryFormatter bin = new BinaryFormatter();
bin.Serialize(fs, _forSerialize);
}
using (Stream fs = File.OpenRead("test.bin"))
{
BinaryFormatter bin = new BinaryFormatter();
_forSerialize = (List<MyClass>)bin.Deserialize(fs);
}
if (_forSerialize.Count == 4)
Console.WriteLine("BinaryFormatter serializer work");
// Test protobuf-net Serializer
using (FileStream fs = File.Create("test.protobuf-net"))
ProtoBuf.Serializer.Serialize(fs, _forSerialize);
using (FileStream fs = File.OpenRead("test.protobuf-net"))
_forSerialize = ProtoBuf.Serializer.Deserialize<List<MyClass>>(fs);
if (_forSerialize.Count == 4)
Console.WriteLine("protobuf-net serializer work");
// Test ProtoSharp Serializer
using (FileStream fs = File.Create("test.ProtoSharp"))
ProtoSharp.Core.Serializer.Serialize(fs, _forSerialize);
using (FileStream fs = File.OpenRead("test.ProtoSharp"))
_forSerialize = ProtoSharp.Core.Serializer.Deserialize<List<MyClass>>(fs);
if (_forSerialize.Count != 4)
Console.WriteLine("ProtoSharp serializer NOT work");
Console.ReadLine();
}
}
}
1137 次
1 に答える
1
protosharpは、ルートオブジェクトとしてリストをサポートしていません。あなたはそれを包む必要があるでしょう:
public class SomeWrapper
{
private readonly List<MyClass> items = new List<MyClass>();
[ProtoSharp.Core.Tag(1)]
public List<MyClass> Items { get { return items; } }
}
...
var tmp = new SomeWrapper();
tmp.Items.AddRange(_forSerialize);
using (FileStream fs = File.Create("test.ProtoSharp"))
ProtoSharp.Core.Serializer.Serialize(fs, tmp);
using (FileStream fs = File.OpenRead("test.ProtoSharp"))
_forSerialize = ProtoSharp.Core.Serializer.Deserialize<SomeWrapper>(fs).Items;
if (_forSerialize.Count == 4)
Console.WriteLine("ProtoSharp serializer work");
これは、protobuf-net出力と(バイト単位で)同一である必要があります。
ただし、protobuf-netは同じ仕事をしますが、protosharpが提供するものをはるかに超えて大幅に洗練および最適化されており、さらに多くのシナリオがサポートされていることをお勧めします(おそらくそれほど謙虚ではありません)。
-
編集:興味深いことに、それらは同一の出力ではありません。protosharpには2バイト余分にあります...理由を見つけることができるかどうかを確認します...編集-編集:ああ、それはデフォルトのゼロの動作です。心配しないでください。参考までに、次のように作成するMessageType
と、2つのprotobufベースのシリアライザーの出力は(期待どおりに)100%同一になります。
[ProtoSharp.Core.Tag(1)]
[ProtoBuf.ProtoMember(1, IsRequired = true)]
public int MessageType { get; set; }
于 2012-09-05T12:42:00.893 に答える