Rust - serde/bincode serializacia/deserializacia dat

anonacct

Re:Rust - serde/bincode serializacia/deserializacia dat
« Odpověď #15 kdy: 18. 12. 2021, 15:07:12 »
Když nechceš enum, tak tam dej int :)


Re:Rust - serde/bincode serializacia/deserializacia dat
« Odpověď #16 kdy: 18. 12. 2021, 16:07:24 »
Ad unsafe – je pravda, že tím dělá člověk z Rustu Céčko. Na druhou stranu, pokud bych měl mít kousek unsafe a zbytek ± idiomatický Rust, stále v tom vidím smysl.

Záleží, co od toho očekáváte. Ona low-level serializace a deserializace v podstatě bez unsafe nejde, protože tam narážíte na problémy, které jsem popsal. (Pravda, část z nich nesouvisí tolik s unsafe, ale stačí jeden, který souvisí.) Bez unsafe je několik možností:

A. Jak jsem psal v tom prvním příspěvku, zbavil bych se nadbytečného fieldu a hledal, jak ten enum tag serializovat do jednoho bytu. Možná bude fungovat to, co jsem poslal. Možná s tím bude problém, že budete serializovat jen ten tag bez dat,  ale to.snad zjistíte velmi rychle při pokusu o deserializaci.
B. Ty flatbuffers by taky mohly jít
C. Když všechno ostatní selže, můžete si udělat serializaci a deserializaci posvém.

Idris

  • *****
  • 2 286
    • Zobrazit profil
    • E-mail
Re:Rust - serde/bincode serializacia/deserializacia dat
« Odpověď #17 kdy: 18. 12. 2021, 17:04:58 »
Když nechceš enum, tak tam dej int :)
Babica radí: Když nemáš enum, dej tam int. Kdo nemá int, tak ať tam dá nějaký jiný číselný typ. A teď pozor, důležitý! Kdo nemá žádný typ, ať tam nedává vůbec žádný typ :)

Idris

  • *****
  • 2 286
    • Zobrazit profil
    • E-mail
Re:Rust - serde/bincode serializacia/deserializacia dat
« Odpověď #18 kdy: 18. 12. 2021, 17:45:15 »
Na druhou stranu, pokud bych měl mít kousek unsafe a zbytek ± idiomatický Rust, stále v tom vidím smysl.
Tohle se dělá běžně, i v knihovně Rustu, ono to často ani jinak nejde.

Re:Rust - serde/bincode serializacia/deserializacia dat
« Odpověď #19 kdy: 18. 12. 2021, 17:47:50 »
Však; chtěl jsem odporovat tvrzení, že pak je lepší sáhnout rovnou po C.


Idris

  • *****
  • 2 286
    • Zobrazit profil
    • E-mail
Re:Rust - serde/bincode serializacia/deserializacia dat
« Odpověď #20 kdy: 18. 12. 2021, 18:01:15 »
chtěl jsem odporovat tvrzení, že pak je lepší sáhnout rovnou po C.
Jistě, pokud je celá aplikace v “safe” Rustu a někde jeden unsafe blok, tak má Rust pořád smysl. IMHO právě na této úrovni má Rust smysl, protože co si budeme povídat, v holém C je snadné nasekat těžko odhalitelné chyby.

Ink

  • *****
  • 655
    • Zobrazit profil
    • E-mail
Re:Rust - serde/bincode serializacia/deserializacia dat
« Odpověď #21 kdy: 18. 12. 2021, 20:34:41 »
Hele a nedá se prostě ten enum přes serde serializovat s pomocí "untagged"? Něco jako

Kód: [Vybrat]
use bincode;
use serde::{Serialize, Deserialize};

type Version = u8;
type BatteryHealth = u8;

#[derive(Debug, Serialize)]
#[serde(untagged)]
pub enum MessageBodyType {
    Version(Version),
    BatteryHealth(BatteryHealth),
}

fn main() {
    let body = MessageBodyType::BatteryHealth(1);
    let encoded: Vec<u8> = bincode::serialize(&body).unwrap();
    println!("Result {:?}", encoded);
}

« Poslední změna: 18. 12. 2021, 20:36:35 od Ink »

Re:Rust - serde/bincode serializacia/deserializacia dat
« Odpověď #22 kdy: 19. 12. 2021, 19:04:05 »
Spravy su vsehovsudy jednoduche, nieje nutne ich balit do msgpack, protobuf, bson a pod.

ASN.1 BER ?
[/provokace]

(Hihihi :-D a zdrhám až se mi za patami práší, než po mně někdo něco hodí.)

RDa

  • *****
  • 2 467
    • Zobrazit profil
    • E-mail
Re:Rust - serde/bincode serializacia/deserializacia dat
« Odpověď #23 kdy: 19. 12. 2021, 19:26:02 »
ASN.1 BER ?
(Hihihi :-D a zdrhám až se mi za patami práší, než po mně někdo něco hodí.)

+1

Jako me to taky napadlo, ze prece existuji standardy jak neco serializovat, ale to neni pry dostatecne moderni a hranate jako ctvercove kolo ;)

Ani nevim co me to nedavno potkalo, ale musel jsem deserializovat nejaky ASN blob - tak otevrete standard, projdete bit po bitu.. a mate vysledek.

Neco takoveho u tech frikulinskych knihoven asi tezko nastane - jakmile neni implementace, tak si neskrtnete, a bez toho aniz by jste spustili onen kod taky ne.. nechapu co na tom lidi bavi, k ladeni to je uplne peklo.

Re:Rust - serde/bincode serializacia/deserializacia dat
« Odpověď #24 kdy: 19. 12. 2021, 19:48:25 »
Spravy su vsehovsudy jednoduche, nieje nutne ich balit do msgpack, protobuf, bson a pod.

ASN.1 BER ?
[/provokace]

(Hihihi :-D a zdrhám až se mi za patami práší, než po mně někdo něco hodí.)

Prave naopak, ja sa rad niecomu novemu priucim, nieje dovod vyskakovat z okna :)


Sice netusim, ako moc je Rust hranaty, moderny alebo firkulinsky - to musia zhodnotit lepsi ako ja.
Ma nejaky prinos implementacia ASN.1 BER/TLV a obdobne na strane Rust-u a zaroven v C, ked si budem vymienat spravy o maximalnej dlzke 64bytov? Neviem pytam sa...

Idris

  • *****
  • 2 286
    • Zobrazit profil
    • E-mail
Re:Rust - serde/bincode serializacia/deserializacia dat
« Odpověď #25 kdy: 19. 12. 2021, 20:41:15 »
Sice netusim, ako moc je Rust hranaty, moderny alebo firkulinsky
Je tohle všechno, a to značně :)

RDa

  • *****
  • 2 467
    • Zobrazit profil
    • E-mail
Re:Rust - serde/bincode serializacia/deserializacia dat
« Odpověď #26 kdy: 19. 12. 2021, 21:00:27 »
Sice netusim, ako moc je Rust hranaty, moderny alebo firkulinsky - to musia zhodnotit lepsi ako ja.
Ma nejaky prinos implementacia ASN.1 BER/TLV a obdobne na strane Rust-u a zaroven v C, ked si budem vymienat spravy o maximalnej dlzke 64bytov? Neviem pytam sa...

Jiste ze ma. Jednak je velka sance, ze na strane Rust-u bude ready made knihovna pro tohle formatovani, a na strane C muzes lehce vyjit z binarni sablony, kde budes jenom tocit hodnoty, ale tu omacku kolem typovani a strukturovani budes mit preddefinovanou (use case: par statickych zprav, a dynamicka runtime kompozice bistreamu neni zadouci).

Pokud ono C bude zpravy i dostavat, tak muzes udelat svuj parser na podmnozinu, ktery to muze vzdat, jestli prijde neco jineho.

Otazka taky pak - proc jit do binarni formy, pokud by se jednalo o humanoidni data - v tom pripade bych mozna preferoval i JSON (nebo v extremu pak ukecanejsi XML).

Pridavam i aplikacni dotaz tedy:

Je potreba, aby zprava byla kontrolovatelna zda je well-formed, nebo ta aplikace snese krmeni jakymkoliv binarnim bordelem?
(jako ne, ze by nesla krmit i falesnymi daty v textove podobe.. ale u binarni varianty se to hur kontroluje, kdyz to neni napr v tom ASN.1)
(a pak se uz pomalu dostavame k bezpecnosti, zda by zprava mela byt kryptograficky podepsana)

Re:Rust - serde/bincode serializacia/deserializacia dat
« Odpověď #27 kdy: 19. 12. 2021, 22:35:07 »
...no já si z dob svého telecího mládí pamatuju nějaké open-source ASN.1 knihovny, kde se tuším generovaly C++ třídy nějakým lexerem z ASN.1 symbolické notace, a pak se to C++ kompilovalo. Něco takového bych do MCU rozhodně cpát nechtěl. Tenkrát kdysi pod Windózama, když jsem si chtěl hrát se SNMP, a nějak jsem nedokázal najít vyhovující portovatelnou jednoduchou knihovnu ASN.1, tak jsem si pár základních datových typů ASN.1 BER napsal v jednoduchém C++ sám. (Ty zdrojáky dávno nemám. Stejně to bylo jenom torzo.)

Re:Rust - serde/bincode serializacia/deserializacia dat
« Odpověď #28 kdy: 19. 12. 2021, 23:42:57 »
(a pak se uz pomalu dostavame k bezpecnosti, zda by zprava mela byt kryptograficky podepsana)

asi tezko tohle resit u zprav, ktere maji jednotky bytu. Bezpecnost asi resi nejaky stateful protokol nad tim.

Re:Rust - serde/bincode serializacia/deserializacia dat
« Odpověď #29 kdy: 20. 12. 2021, 00:45:26 »
1. Bincode je formát určený pro Rust, implementace je silně založena na Rustovém typovém systému a implementace pro jiné jazyky (zatím) nejsou. Takže nevím jestli je to dobrý nápad pro komunikaci s C programy.

2. CBOR?