Firstly, I apologize for my poor English. I hope the content remains understandable.
GraphCodable is an experimental Swift encode/decode package (similar to Codable at interface level) that does not treat reference types as second-class citizens.
With version 0.2.0 and later versions, the package has been completely revised. It now relies on
_mangledTypeName(...) (when available) and
NSStringFromClass(...) to generate the "type name" and on
NSClassFromString(...) to retrieve the class type from it. At least on Apple systems this procedure should now be stable.
Thanks to this change it is no longer necessary to register the classes (the repository is gone) or even set the main module name.
All the previous features are maintained, except for the reference type replacement system which is no longer available at this point in the redesign phase.
- encodes type information (for reference types);
- supports reference inheritance;
- never duplicates the same object (as defined by ObjectIdentifier);
- in other words, it preserves the structure and the types of your model unaltered during encoding and decoding;
- is fully type checked at compile time (*);
- supports keyed and unkeyed coding, also usable simultaneously;
- supports conditional encoding;
- implements an userInfo dictionary;
- implements a reference type version system;
- implements a reference type substitution system during decode NOT AIVAILABLE NOW - I'm redesigning it;
Check code examples in the User Guide. Check the tests section, too.
(*) Fully type checking at compile time is mutually exclusive with the ability to encode/decode heterogeneous collections (i.e.
[Any]) containing 'codable' elements. I chose to support the first feature while giving up the second.
Most Swift Standard Library and Foundation types are supported now. The list is here.
GraphCodable can encode and decode any 'ARC compatible' Swift object graph, regardless of how complex it is, reconstructing its original structure with its original types without duplicating objects. Only weak variables used in the object graph in order to avoid strong memory cycles in ARC require special treatment during initialization within the
init (from: GDecoder) method. One limitation exists: you cannot put a weak variable that must employ the above mechanism inside a value type but only inside a reference type.
This table summarizes the methods to be used depending on the type of variable to be encoded and decoded.
GraphCodable does not use a public format for the data (such as JSON or others) but stores the data in a private binary format defined by the package itself. Having to preserve information about the types, GraphCodable creates larger data in bytes than those generated by Codable encoders. Despite this, the time required for encoding and decoding is generally comparable if not faster.
GraphCodable is written entirely in Swift. The use of 'unsafe' methods is limited to a handful of functions related to reading and writing data in binary format (see BinaryIO). Everything else is 'safe'.
For now, the data format may be subject to future changes.
Simple interface comparison to Swift Codable
- GCodable have the same roles as Codable
- GEncoder, GDecoder have the same roles as Encoder, Decoder
- GraphEncoder has the same role as JSONEncoder, PropertyListEncoder
- GraphDecoder has the same role as JSONDecoder, PropertyListDecoder
GraphCodable does not use containers.
- Swift 5.3
Check it here.
GraphCodable is released under the MIT license. See LICENSE for more details.