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>

Я надеюсь, что это полезно для вас, но дайте мне знать, если у вас есть какие-либо вопросы, или что-то неясно:)

Другие вопросы по тегам