Ich habe die folgende Struktur, die ich gerne verschlüsseln. Ich bin mir bewusst, dass ich einen Vektor mit vector() codieren kann, wenn das Größenfeld direkt vor den Vektordaten ist. Aber hier ist das Feld, das die Vektorgröße codiert, nicht benachbart.Codierung Vektor Länge Feld nicht neben dem Vektor
case class Item(
address: Int,
size: Int,
)
case class Header {
// lots of other fields before
numOfItems: Int,
// lots of other fields after
}
case class Outer(
hdr: Header,
items: Vector[]
)
Decodierung von Outer ist OK:
Header.numOfItems aus dem Bit-Vektor lesen und Gegenstände mit vectorOfN (liefern (hdr.numOfItems, Item.codec)) erstellt
Encoding von Äußerlich ist das Problem:
Bei der Codierung möchte ich numOfItem aus der items.length genommen werden. Ich bin mir bewusst, dass ich numOfItems mit zusätzlichen Code festlegen konnte, wenn der Artikel Vector aktualisiert wird oder mit etwas wie einem "vor der Codierung Rückruf".
Die Frage ist, ob es eine elegantere Lösung gibt. Für mich ist Header.numOfItems
redundant mit Outer.items.length
, also sollte idealerweise nur der Encoder über numOfItems Bescheid wissen.
Ok. Ein bisschen Wiederholung beim Vergleich mit der "Atomic ..." Lösung, aber der Vorteil eines "zustandslosen" Codecs. Wenn es keine bessere Lösung gibt, würde ich sagen, dass dies die akzeptierte Antwort ist. –