Я использую Protobuf.net, и я сделал это, пометив мои классы следующим образом:
namespace music
{
[ProtoContract]
public class Album
{
[ProtoMember(1)]
public string Name { get; set; }
[ProtoMember(2)]
public List<string> TrackList { get; set; }
}
}
Это работает для словарей и списков тоже.
Применяются те же правила нумерациик атрибутам относительно использования файлов сообщений .proto, но вы можете включить свойства в базовые классы, такие как:
[ProtoContract]
[ProtoInclude(10, typeof(TypeInheritingFromPerson))]
[ProtoInclude(11, typeof(AnotherTypeInheritingFromPerson))]
public abstract class Person
{
[DataMember]
[ProtoMember(1)]
public string Name { get; set; }
...
и затем использовать эту строку кода для сериализации:
MemoryStream stream = new MemoryStream();
ProtoBuf.Serializer.Serialize<Album>(stream, album);
Конечно, вы можете использовать файловый поток вместо потока памяти:)
Если вы используете WCF, вы можете поменять DataContractSerializer для сериализатора Protobuf прямо в файле конфигурации, как это (как копия, вставленная из документации protobuf.net).), поэтому вам не нужно вручную вызывать какой-либо код сериализации:
Добавьте следующее в файл app.config сервера и клиента в разделе system.serviceModel:
<behaviors>
<endpointBehaviors>
<behavior name="ProtoBufBehaviorConfig">
<ProtoBufSerialization/>
</behavior>
</endpointBehaviors>
</behaviors>
<extensions>
<behaviorExtensions>
<add name="ProtoBufSerialization" type="ProtoBuf.ServiceModel.ProtoBehaviorExtension, protobuf-net, Version=1.0.0.255, Culture=neutral, PublicKeyToken=257b51d87d2e4d67"/>
</behaviorExtensions>
</extensions>
НастройтеКонечные точки имеют конфигурацию поведения следующим образом:
<service name="TK.Framework.Samples.ServiceModel.Contract.SampleService">
<endpoint address="http://myhost:9003/SampleService" binding="basicHttpBinding" behaviorConfiguration="ProtoBufBehaviorConfig"
bindingConfiguration="basicHttpBindingConfig" name="basicHttpProtoBuf" contract="ISampleServiceContract" />
</service>
<client>
<endpoint address="http://myhost:9003/SampleService" binding="basicHttpBinding"
bindingConfiguration="basicHttpBindingConfig" contract="ISampleServiceContract"
name="BasicHttpProtoBufEndpoint" behaviorConfiguration="ProtoBufBehaviorConfig"/>
</client>
Я надеюсь, что это полезно для вас, но дайте мне знать, если у вас есть какие-либо вопросы, или что-то не такясно:)