É recomendável usar algo que não seja XML para o meu arquivo de configuração?

8

Estou desenvolvendo uma pequena ferramenta que exigiria algum tipo de arquivo de configuração. O arquivo de configuração no meu caso é realmente mais um banco de dados, mas precisa ser leve e, se necessário, o usuário final deve encontrá-lo facilmente editável. No entanto, também conterá muitas coisas nele. (dependendo de certos fatores, pode ser de 1Mb ou mais)

Decidi que preferiria usar texto simples, em vez de tentar usar SQLite ou algo parecido. No entanto, com o uso de texto, eu também tenho que lidar com a variedade de formatos. Até agora, minhas opções são

  • XML
  • JSON
  • Formato personalizado

Os dados no meu arquivo são bastante simples, consistindo na maior parte das coisas do tipo valor-chave. Portanto, um formato personalizado não seria tão difícil ... mas prefiro não ter que me preocupar em escrever o suporte para ele. Eu nunca vi o JSON usado para arquivos de configuração. E XML aumentaria substancialmente o tamanho do arquivo, eu acho. (Eu também apenas não gosto de XML em geral).

O que devo fazer neste caso?

Fatores a serem considerados:

  • Esse arquivo de configuração pode ser carregado em um serviço da Web (o tamanho é importante)
  • Os usuários devem poder editá-lo manualmente, se necessário (facilidade de edição e leitura)
  • Deve ser capaz de gerar e processar automaticamente (a velocidade não importa muito, mas não é excessivamente lenta)
  • As "chaves" e "valores" são cadeias simples, mas precisam ser escapadas porque podem conter qualquer coisa. (Unicode e escape precisam funcionar facilmente)
  • Vários arquivos de configuração. Basicamente, cada arquivo de configuração está vinculado a um "projeto"
Earlz
fonte
10
A configuração no .NET é um processo maduro e bem compreendido ... por que reinventar a roda?
MattDavey
3
Por que você não está considerando o YAML? Eu acho que o YAML é o melhor ajuste.
sawa
1
@sawa, na verdade, nunca ouvi falar do YAML. Parece bastante interessante
Earlz:
5
@Earlz and if needed the end-user should find it easily editable. However, it also will contain a lot of things in it. (depending on certain factors, could be 1Mb or more). Você não pode comer seu bolo. Arquivos de 1 MB, por definição, não são facilmente editáveis. Ou é um banco de dados (mesmo que pequeno), e o SQL-lite é uma boa opção ou é um arquivo de configuração (você não deve ter 1 MB de configuração).
Pieter B
3
E os arquivos INI? Eles são a maneira mais comum de configurar aplicativos nos sistemas Windows e UNIX.
#

Respostas:

12

Eu acho que o YAML é melhor para o seu caso. Para mim, o YAML é o formato padrão de fato para os arquivos de configuração que precisam ser editados manualmente. Muitas linguagens de programação possuem uma biblioteca para ler e / ou escrever YAML. O JSON está intimamente relacionado ao YAML, mas é um pouco menos fácil de escrever que o YAML e é usado mais para comunicação entre o servidor da Web e o programa cliente.

sawa
fonte
4
De fato entre quem?
Donal Fellows
6

Se você usar JSON, as pessoas não poderão comentar bits de configuração para tentar coisas diferentes. Para mim, isso é um desagrado.

Isso também significa que você não pode fornecer um arquivo de configuração de amostra bem comentado para os usuários personalizarem.

XML é padrão e, se você puder fornecer um esquema, seus usuários agradecerão.

artbristol
fonte
2
+1 Eu estava prestes a mencionar minhas experiências ruins com o JSON. Não é um formato de "configuração" válido: nenhum comentário, realmente legível, fácil de deixar vírgulas em listas, não lida com referências entre objetos de configuração. YAML ou XML são as opções reais.
Jjmontes
5

Depois de analisar seus requisitos e perceber que você não gosta do XML, eu aconselho você a usar o JSON. Devo admitir que lidei apenas com XML e JSON, portanto não posso falar por nenhum outro formato de configuração comum por aí.

JSON é realmente fácil de escrever e, se formatado corretamente, fácil de ler. O Google adora o JSON pelo uso da configuração em suas ferramentas. Além disso, o JavaScript pode transformá-lo em objetos de forma nativa.

QAH
fonte
2

Um arquivo "propriedades" é bom para chave / valor, pois o próprio formato é chave / valor. É simplesmente uma linha por chave / valor. O primeiro sinal = na linha divide a chave e o valor.

Será menor que um arquivo XML equivalente, pois a única formatação é o separador "=" e o caractere de nova linha. Em um arquivo XML, a marcação pode ocupar tanto espaço quanto o próprio conteúdo. Poderia literalmente significar a diferença entre um upload de 1 MB e 2 MB. A compactação ajuda, mas você ainda está à frente se começar pequeno.

As bibliotecas existentes podem manipular o acesso aos arquivos de propriedades. Mas é tão trivial que você pode criar a sua em poucos minutos. Sinos e assobios em menos de uma hora.

IP=11.22.33.44
BuildNumber=5.02.004
MaxFrameRate=50
mike30
fonte
2

Algumas boas respostas aqui já. Mas se eu estivesse no seu lugar, antes de jogar XML por cima, consideraria os seguintes pontos:

  • O XML é muito bem suportado pela estrutura .NET e ferramentas de terceiros. Para o JSON, você terá que escolher uma biblioteca de terceiros e verificar se ela atende a todos os seus requisitos.

  • se você precisar de edição manual apenas em alguns casos excepcionais, o XML provavelmente sofrerá suas necessidades. Se houver muita edição a ser feita e sua lista de opções de configuração tiver uma complexidade específica, é provável que os usuários precisem de algum tipo de aplicativo de opção / configuração com base em diálogo - o que significa que não importa se o formato XML subjacente é 100 % amigo do usuário. Se você não quiser escrever isso, pelo menos, poderá recomendar algum tipo de editor de XML para seus usuários. Ferramentas como o bloco de notas XML ou as ferramentas XML do Notepad ++ funcionam bem para muitas pessoas.

  • Eu acho que as chances são maiores de que seus usuários finais tenham visto algum tipo de XML antes do que as chances de terem visto o JSON antes - o que tornará um pouco mais fácil para eles entenderem (se realmente precisam)

  • O JSON não suporta comentários, o que pode dificultar a edição manual

  • se o tamanho realmente for um problema para carregar os dados em um serviço da web, considere usar a compactação de dados

Na verdade, se você pensar sobre esses pontos e não quiser usar XML de qualquer maneira, use JSON. O uso de XML ou JSON já fornece maneiras padrão de escapar seqüências de caracteres, maneiras padrão de estender sua estrutura de configuração posteriormente e bibliotecas prontas para ler e escrever esses formatos - não há necessidade de reinventar a roda com qualquer "formato personalizado".

Doc Brown
fonte
O grande problema que tenho com XML é que é muito detalhado. Se eu tiver 2000 strings com 20 caracteres, são 40000 bytes ou 40K. Agora adicione XML e a sobrecarga de tags XML em tudo pode realmente aumentar. <MyString>e </MyString>adiciona até 21 caracteres a mais por sequência. Este é o problema que tenho com XML neste cenário específico, onde o tamanho importa, mas não é tão importante, onde seria necessário binária ou algo
Earlz
1
@Earlz: como escrevi acima, se o tamanho realmente importa, por que não tentar a compactação de dados (por exemplo, com icsharpcode.net/OpenSource/SharpZipLib/Default.aspx )? E honestamente, você tem certeza absoluta de que isso importa no seu cenário se os arquivos tiverem 40 ou 80K?
Doc Brown)
1

No que diz respeito aos arquivos de configuração, "1Mb ou mais" certamente está do lado grande, e a necessidade de escapar de strings e manter muitas citações correspondentes não funciona bem com humanos. É por isso que, para arquivos de configuração grandes que precisam ser mantidos por humanos, você definitivamente deve considerar a definição de um formato personalizado e a construção de um analisador personalizado. Aqui está um artigo sobre o assunto de seres humanos que precisam escrever XML: Os humanos não devem ter que criar XML .

Quando analisadores e geradores de analisadores estavam em sua infância, você poderia defender a não criação de um personalizado, dizendo que a construção de um idioma personalizado é muito complexa. Agora que os geradores de analisadores excelentes e muito simples amadureceram, não há desculpa: você pode criar um analisador personalizado em questão de horas, a par do tempo que levaria para criar um analisador para uma linguagem baseada em XML * .

Aqui está um pequeno tutorial explicando o processo de construção de um analisador personalizado com o ANTLR . Está em Java, mas o ANTLR também suporta C #.


* A menos que você opte pela conversão baseada em desserialização do XML, nesse caso, a construção de um analisador baseado em XML levaria menos tempo, mas suas classes precisariam ter uma "forma" que se assemelhe ao seu XML.

dasblinkenlight
fonte
0

O JSON é uma boa opção por sua flexibilidade, facilidade de leitura e edição fora do seu programa, pela ampla disponibilidade de bibliotecas de análise para suportá-lo. Ele suporta hierarquia, presta-se a uma compatibilidade simples de avanço / retrocesso que um arquivo que simplesmente salva dados em sequência não. Eu acho que também possui técnicas fáceis para converter entre classes Java e dados de arquivos e depois voltar para o outro lado. Muitas pessoas conhecem e codificaram para esse formato, e o formato é importante para outros programas com os quais você provavelmente precisará trabalhar no futuro.

Muitos sistemas foram baseados no formato .ini e são muito fáceis de analisar se você estiver escrevendo um analisador do zero.

O csv pode ser rápido em codificar e funciona com muito pouca sobrecarga, mas tem problemas com flexibilidade, compatibilidade com versões anteriores e posteriores.

Usar o registro era uma prática comum no Windows.

O uso de cookies é comum no desenvolvimento da web.

Para uma função de utilitário, talvez use apenas texto em formato livre que corresponda às suas opções de linha de comando, basta lê-lo e criar uma matriz de strings argv.

DesenvolvedorDon
fonte
0

Não use XML.

XML é uma linguagem de marcação. Quando usado para serialização ou linguagem de configuração, o XML tem um problema fundamental, a saber, que atributos e conteúdo de texto de um elemento podem descrever a mesma coisa. Você precisa decidir entre atributos e conteúdo do texto. Além disso, o XML é desnecessariamente detalhado, necessitando, por exemplo, de especificar o nome do elemento duas vezes (abrir, fechar).

Use XML para o que isso significa: como uma linguagem de marcação. Os arquivos de configuração não requerem uma linguagem de marcação.

Também não use JSON.

JSON é maravilhoso como formato de serialização de dados. No entanto, o JSON não possui comentários. Isso, para mim, é um desagrado. Além disso, você precisa escapar de todas as ocorrências do "personagem.

Não use INI.

Os arquivos INI têm um problema fundamental: eles não possuem estruturas de dados aninhadas. A única noção de aninhamento é que uma tag pode ter vários atributos. Isso é apenas 1 nível de aninhamento. Nos casos de uso da vida real, achei essa limitação extremamente irritante. Eu trabalhei como parte de um projeto em que a configuração estava nos arquivos INI e as dores são maiores.

Use um idioma personalizado, se possível.

Se você tiver acesso às ferramentas do gerador de analisador, como Lex e Yacc, use um idioma personalizado. Não sei ao certo qual é o estado dos geradores de analisadores no .NET, mas, para o código C, eu escolheria Lex & Yacc. A curva de aprendizado no começo pode ser um pouco íngreme (Lex & Yacc não são as ferramentas mais fáceis de usar), mas o tempo investido em aprendizado vale totalmente a pena.

Se o idioma personalizado não for possível, use o YAML.

Y AML, como o nome indica, um in't m arkup l anguage. É uma linguagem de serialização que se deve às suas propriedades aceitáveis ​​para arquivos de configuração, porque suporta comentários. O YAML não é desnecessariamente detalhado como o XML: não requer a especificação do nome do elemento duas vezes (abrir, fechar). O YAML não tem o problema do atributo vs. conteúdo do texto do XML.

Considere pro.per.ty = value também.

Se você deseja uma configuração do tipo INI, na qual o aninhamento é suportado, considere um formato que consiste em pro.per.ty=valuepares (pares de valores-chave), nos quais a chave pode ter vários níveis aninhados, usando o .caractere como separador.

juhist
fonte