Se vuoi serializzare e deserializzare oggetti Texture, allora dovresti avere costruttori, metodi o interfacce progettate esplicitamente per questo scopo. La serializzazione è uno dei pochi casi d'uso che è abbastanza speciale per meritarlo.
Poiché questo è C ++, hai molte opzioni. In cima alla mia testa:
- Fornisci i metodi
Texture
class serialize()
e deserialize()
. La semplicità è una virtù.
- Crea una classe
TextureSerializer
separata che sia un friend
della classe Texture
in modo che tu possa rendere setUUID()
privato. Questo approccio è spesso una buona idea se ti aspetti che la serializzazione sia complicata o abbia dipendenze non banali o che la classe Texture
abbia già un sacco di cose.
- Crea una classe
Serializable
con metodi virtuali serialize()
e deserialize()
e nessuno stato, a.k.a. un'interfaccia e fai Texture
a implementare tale interfaccia. Se ti aspetti che altri programmatori possano scrivere le proprie classi serializzabili che il tuo programma deve gestire, questo potrebbe essere l'approccio più sicuro e generico.
- Crea una classe base
SerializableTaggedObject
con metodi virtuali serialize()
e deserialize()
e il membro uuid
e il costruttore generatore uuid che hai attualmente in ObjectTag
. Se hai diverse classi simili a Texture
, che devono essere entrambe serializzabili e avere uuid, questa potrebbe essere la scelta migliore.
Tutte queste opzioni ti proteggeranno da utenti non malintenzionati che semplicemente non hanno letto i commenti che hai scritto sopra setUUID()
. Come puoi vedere dalle mie osservazioni aggiuntive, quale sceglierai in realtà dovrebbe dipendere da molti altri fattori, ma ognuno di essi sarebbe un enorme miglioramento rispetto all'esposizione di un setter pubblico per un campo che dovrebbe essere immutabile.
Sto deliberatamente saltando alcune domande di implementazione, ad esempio se uno di questi metodi dovrebbe essere statico. Suppongo che tu non stia cercando di proteggere dagli utenti malintenzionati che chiamerebbero volentieri Texture.deserialize("{ \"uuid\": \"bwahahahaha\" }")
invece di setUUID()
, ma semplicemente impediscono agli utenti di attivare erroneamente comportamenti non definiti nel tuo codice.
P.S. Dato che hai menzionato in modo specifico le DLL, sento che dovrei menzionare anche l'idioma pimpl , dal momento che nasconde i dettagli di implementazione in un modo che spesso migliora la compatibilità binaria , che tende ad essere una preoccupazione particolarmente strong per le DLL. Ovviamente devi ancora mettere un meccanismo di serializzazione da qualche parte sulla reale implementazione, quindi questo sarebbe in aggiunta a una delle opzioni che ho descritto sopra.