ProtoBuf.Net - использовать Proto как TypeFormatter
Я использую ProtoBuf.Net в качестве NetDataContractSerializer(или BinarySerializer), я разместил здесь код. Это метод проб и ошибок, но он по-прежнему не работает со списком, словарем и т. Д. Похоже, что я иду в неправильном направлении. Это возможно?
Ваше мнение будет оценено.
1 ответ
Я использую 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>
Сконфигурируйте ваши конечные точки, чтобы иметь поведение Configuration следующим образом:
<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>
Я надеюсь, что это полезно для вас, но дайте мне знать, если у вас есть какие-либо вопросы, или что-то неясно:)