ProtoBuf.Net - использовать Proto как TypeFormatter - PullRequest
0 голосов
/ 25 марта 2012

Я использую ProtoBuf.Net в качестве NetDataContractSerializer (или BinarySerializer), я разместил здесь код code .Это метод проб и ошибок, но он по-прежнему не работает со списком, словарем и т. Д. Похоже, что я иду в неправильном направлении, возможно ли это?

Ваше мнение будет оценено.

1 Ответ

0 голосов
/ 27 марта 2012

Я использую 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>

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

...