2011-11-27 7 views
11

Il formato di termine esterno di Erlang has changed at least once (ma questa modifica sembra essere precedente alla cronologia memorizzata nel repository github di Erlang/OTP); chiaramente, potrebbe cambiare in futuro.La definizione del formato di termine esterno di Erlang è stabile? In caso contrario, cosa usare?

Tuttavia, in pratica, è generalmente considerato sicuro assumere che questo formato sia stabile ora? Con "stabile" intendo specificamente che, per qualsiasi termine T, term_to_binary restituirà lo stesso binario in qualsiasi versione corrente o futura di Erlang (non solo se restituirà un binario che binary_to_term convertirà in un termine identico a T) . Sono interessato a questa proprietà perché mi piacerebbe archiviare hash di termini arbitrari di Erlang su disco e voglio che termini identici abbiano lo stesso valore di hash ora e in futuro.

Se non è sicuro assumere che il termine formato sia stabile, che cosa usano le persone per una serializzazione a termine efficiente e stabile?

risposta

7

è stato affermato che erlang fornirà compatibilità per almeno 2 versioni principali. ciò significherebbe che i file BEAM, il protocollo di distribuzione, il formato dei termini esterni, ecc. da R14 funzioneranno almeno fino a R16.

"We have as a strategy to at least support backwards compatibility 2 major releases back in time."

"In general, we only break backward compatibility in major releases and only for a very good reason and usually after first deprecating the feature one or two releases beforehand."

+0

Anche se queste dichiarazioni lasciano aperta la possibilità che il formato del termine esterno cambierebbe in una versione principale (probabilmente solo in caso di emergenza) o in un modo compatibile, ma non necessariamente identico, la politica è piuttosto incoraggiante. Grazie! – willb

1

per la serializzazione dei dati, di solito scelgo tra Google buffer protocollo e JSON. Entrambi sono molto stabili. Per lavorare con questi formati di Erlang uso Piqi, Erlson e mochijson2.

Il grande vantaggio di Protobuf e JSON è che possono essere utilizzati da altri linguaggi di programmazione in base alla progettazione, mentre il formato dei termini esterni di Erlang è più o meno specifico di Erlang.

Si noti che la rappresentazione della stringa JSON dipende dall'implementazione (caratteri di escape, precisione in virgola mobile, spazi bianchi, ecc.) E per questo motivo potrebbe non essere adatta al proprio caso d'uso.

Protobuf è meno semplice da utilizzare rispetto ai formati di schemi, ma è uno strumento molto ben progettato e potente.

Di seguito sono riportati alcuni altri formati di serializzazione binaria di schemi. Non so quanto siano stabili. Potrebbe risultare che il formato dei termini esterni di Erlang sia più stabile.

2

Erlang: phash2 è garantito per essere un hash stabile di un termine di Erlang.

Non penso che OTP faccia la garanzia che sia term_to_binary(T) in vX =: = term_to_binary(T) in vY. Un sacco di cose potrebbero cambiare se introducono nuovi codici temporali per rappresentazioni ottimizzate delle cose. O se abbiamo bisogno di aggiungere stringhe unicode all'ETF o qualcosa del genere. O nel futuro apparentemente improbabile in cui introduciamo un nuovo tipo di dato fondamentale. Per un esempio di modifica che si è verificata solo nella rappresentazione esterna (i termini memorizzati sono uguali ma non uguali in byte) vedere float_ext rispetto a new_float_ext.

In termini pratici, se ci si attiene a atomi, elenchi, tuple, interi, float e binari, probabilmente si è sicuri con lo term_to_binary per parecchio tempo. Se arriva il momento in cui la loro rappresentazione dell'ETF cambia, puoi sempre scrivere la tua versione di term_to_binary che non cambia con l'ETF.

Problemi correlati