Como rápido ou leve Buffer de protocolo é?
-
19-08-2019 - |
Pergunta
buffer de protocolo é para .NET vai ser leve / mais rápido do que Remoting (a SerializationFormat.Binary)? Haverá um suporte de primeira classe para ele em termos de linguagem / framework? ou seja, é tratada de forma transparente como com Remoting / WebServices?
Solução
Eu duvido muito que ele nunca vai ter suporte linguagem direta ou suporte quadro ainda. - É o tipo de coisa que é tratado perfeitamente com bibliotecas 3rd party
meu próprio porto do código Java é explícito - você tem que chamar métodos para serializar / desserializar. (Existem topos RPC que irá automaticamente serializar / desserializar, mas nenhuma implementação RPC ainda.)
fits projeto deEm termos de velocidade, você deve olhar para a página de referência da Marc Gravell . Meu código tende a ser um pouco mais rápido do que o seu, mas ambos são muito, muito mais rápido do que as outras opções de serialização / desserialização no quadro. Deve ser salientado que buffers de protocolo são muito mais limitados, bem como - eles não tentar serializar tipos arbitrários, apenas os suportados. Nós vamos tentar apoiar mais dos tipos de dados comuns (decimal, DateTime, etc.) de uma forma portátil (como seu próprio protocolo tampão mensagens) no futuro.
Outras dicas
Algumas métricas de desempenho e tamanho estão em desta página . Não tenho estatísticas de Jon lá no momento, apenas porque a página é um pouco velho (Jon: precisamos consertar isso!)
. Re BinaryFormatter (comunicação remota); sim, isso tem supprt completo; você pode fazer isso simplesmente uma implementação ISerializable
trivial (ou seja, apenas chamar o método Serializer
com os mesmos argumentos). Se você usar protogen
para criar suas classes, então ele pode fazer isso por você: você pode ativar esse na linha de comando por meio de argumentos (que não está habilitado por padrão como BinaryFormatter
não funciona em todos os enquadramentos [CF, etc]) .
Note que para objetos muito pequenos (instâncias individuais, etc.) sobre remoting local (IPC), o desempenho BinaryFormatter
cru é realmente melhor - mas para não-trivial gráficos ou links remotos (comunicação remota de rede) podem protobuf-net realizar-se -lo muito bem.
Gostaria também de salientar que o formato de fio de buffers de protocolo faz herança não diretamente suporte; protobuf-net pode falsificar isso (mantendo wire-compatibilidade), mas como com XmlSerializer, você precisa declarar as sub-classes up-front.
Por que existem duas versões?
As alegrias de código aberto, eu acho ;-p Jon e eu temos trabalhado em projetos conjuntos antes, e discutiram a fusão destes dois, mas o fato é que eles têm como alvo dois cenários diferentes:
- dotnet-protobufs (Jon) é um porto da versão java existente . Isso significa que ele tem uma API muito familiar para qualquer pessoa que já utilizam a versão java, e é construído em construções java típicos (construtor de classes, classes de dados imutáveis, etc.) - com alguns C # torções
- protobuf-net (Marc) é uma sequência re-execução no terreno-up o mesmo formato binário (na verdade, um requisito fundamental é que você pode trocar dados entre diferentes formatos), mas usando expressões típicas NET:
- classes de dados mutáveis ??(sem construtores)
- as especificidades membro serialização são expressos em atributos (comparáveis ??ao
XmlSerializer
,DataContractSerializer
, etc)
Se você está trabalhando em Java e .NET clientes, Jon é provavelmente uma boa escolha para a API familiares em ambos os lados. Se você é pura .NET, protobuf-net tem vantagens - o familiar API estilo .NET, mas também:
- você não é forçada ser contrato de primeira (embora você pode, e um gerador de código é fornecido)
- você pode reutilizar os objetos existentes (na verdade,
[DataContract]
e aulas[XmlType]
muitas vezes pode ser usado sem qualquer alteração em tudo) - tem o suporte completo para herança (que este atinja no fio por falsificação encapsulamento) (possivelmente única para uma aplicação de buffers de protocolo? Nota que sub-classes têm de ser declaradas previamente)
- ele sai do seu caminho para plugue e explorar ferramentas .NET centrais (
BinaryFormatter
,XmlSerializer
, WCF,DataContractSerializer
) - permitindo-lhe trabalhar diretamente como um mecanismo de comunicação remota. Este provavelmente seria bastante um grande divisão do tronco principal java para a porta de Jon.
Re fundi-las; Eu acho que nós dois estariam abertos a isso, mas parece improvável que você gostaria ambos os conjuntos de recursos, uma vez que eles têm como alvo tais requisitos diferentes.