CeresEngine 0.2.0
A game development framework
Loading...
Searching...
No Matches
Serializer.hpp
Go to the documentation of this file.
1//
2// CeresEngine - A game development framework
3//
4// Created by Rogiel Sulzbach.
5// Copyright (c) 2018-2022 Rogiel Sulzbach. All rights reserved.
6//
7
8#pragma once
9
10#include "Forward.hpp"
12
13#include "Serialization.hpp"
14
16
20
21namespace CeresEngine {
22
23#define CE_SERIALIZER_PRIMITIVE_TYPES(F) \
24 F(float, Float) \
25 F(double, Double) \
26 F(UInt8, UInt8) \
27 F(UInt16, UInt16) \
28 F(UInt32, UInt32) \
29 F(UInt64, UInt64) \
30 F(Int8, Int8) \
31 F(Int16, Int16) \
32 F(Int32, Int32) \
33 F(Int64, Int64) \
34 F(bool, Boolean)
35
42 public:
44
45 public:
53 virtual void serialize(const Box& value) = 0;
54 };
55
66
72 class Serializer : public ISerializer {
73 public:
76
79
80 public:
82 explicit Serializer(const SerializationContext& context = SerializationContext::getDefault());
83
85 ~Serializer() noexcept override;
86
87 public: // Serializer interface
89 void serialize(const Box& value) final;
90
92 virtual void resetState();
93
94 protected: // Object Encoding
98 virtual void beginObject(const SerializedObjectMetadata& metadata) = 0;
99
101 virtual void endObject() = 0;
102
106 virtual void beginObjectProperty(const SerializedPropertyMetadata& metadata) = 0;
107
109 virtual void endObjectProperty() = 0;
110
112 virtual void encodeObjectReference(SerializedObjectID referenceID) = 0;
113
117 virtual void beginCustomObject(const SerializedCustomObjectMetadata& metadata) = 0;
118
120 virtual void endCustomObject() = 0;
121
122 protected: // Array encoding
126 virtual void beginArray(const SerializedArrayMetadata& metadata) = 0;
127
129 virtual void endArray() = 0;
130
131 protected: // Map encoding
135 virtual void beginMap(const SerializedMapMetadata& metadata) = 0;
136
138 virtual void endMap() = 0;
139
140 protected: // Primitive encoding
141#define CE_SERIALIZER_ENCODER_PRIMITIVE_TYPE(T, N) virtual void encode##N(T value) = 0;
143#undef CE_SERIALIZER_ENCODER_PRIMITIVE_TYPE
144 virtual void encodeString(StringView string) = 0;
145 virtual void encodeBinary(MemoryView<const Byte> data) = 0;
146
148 virtual void encodeUndefined() = 0;
149
151 virtual void encodeNull() = 0;
152
153 private: // Reflection visiting
156 void visit(const Box& value);
157
159 void visitObject(const Box& value);
160
162 void visitObjectProperty(const Box& value, const ClassProperty& metaProperty);
163
165 void visitEnum(const Box& value);
166
168 void visitArray(const Box& value);
169
171 void visitMap(const Box& value);
172
173 private:
174 [[nodiscard]] bool shouldSerializeObjectProperty(const Box& value, const ClassProperty& property) const;
175 };
176
177} // namespace CeresEngine
#define CE_SERIALIZER_ENCODER_PRIMITIVE_TYPE(T, N)
Definition Serializer.hpp:141
#define CE_SERIALIZER_PRIMITIVE_TYPES(F)
Definition Serializer.hpp:23
A value type that can hold any alongside it's type information.
Definition Box.hpp:40
Represents a reflected property from metadata defined by the class.
Definition Class.hpp:176
The serializer is responsible from taking a C++ object and make it into stream of bytes from it.
Definition Serializer.hpp:41
virtual void serialize(const Box &value)=0
Serializes the given value into a stream of bytes written to dataStream.
virtual ~ISerializer() noexcept=default
A memory view is a class which attaches to an chunk of memory and provides a view to it (optionally c...
Definition MemoryView.hpp:62
A context that is shared between multiple serializer and deserializer instances.
Definition Serialization.hpp:196
A base class for serializer and deserializer states.
Definition Serialization.hpp:402
The serializer class has basic support for reflection-based serializers.
Definition Serializer.hpp:72
void visitObject(const Box &value)
Visits the object value.
SerializerState state
An object that stores context for the serializer.
Definition Serializer.hpp:78
virtual void encodeBinary(MemoryView< const Byte > data)=0
virtual void encodeString(StringView string)=0
virtual void encodeNull()=0
Encodes a null value to the serialization stream.
void visitMap(const Box &value)
Visits the object as a map.
const SerializationContext & context
A shared context that contains a context for the deserializer.
Definition Serializer.hpp:75
virtual void encodeUndefined()=0
Encodes an undefined value to the serialization stream.
bool shouldSerializeObjectProperty(const Box &value, const ClassProperty &property) const
void visitObjectProperty(const Box &value, const ClassProperty &metaProperty)
Visits a property of the object value.
void visitEnum(const Box &value)
Visits an enum.
void visit(const Box &value)
Visits the given value.
void visitArray(const Box &value)
Visits the object as an array.
Serializer(const SerializationContext &context=SerializationContext::getDefault())
Creates a new serializer instance.
~Serializer() noexcept override
Destroys the serializer.
A class that represents context for a serializer.
Definition Serializer.hpp:57
HashMap< Pair< TypeID, const void * >, SerializedObjectID > serializedObjects
Maps all known serialized objects to a known ID, so they can be re-used later.
Definition Serializer.hpp:64
Definition Application.hpp:19
std::unordered_map< Key, T, Hash, KeyEqual, ScopedAllocatorAdaptor< StdAllocator< Pair< const Key, T >, RawAllocator > > > HashMap
HashMap is an associative container that contains key-value pairs with unique keys.
Definition Map.hpp:33
UInt32 SerializedObjectID
Definition Forward.hpp:24
constexpr size_t hash(const T &v)
Generates a hash for the provided type.
Definition Hash.hpp:25
A structure that holds metadata for a serialized array.
Definition Serialization.hpp:123
A struct that holds metadata for a serialized object.
Definition Serialization.hpp:105
A structure that holds metadata for a serialized map.
Definition Serialization.hpp:148
A struct that holds metadata for a serialized object.
Definition Serialization.hpp:56
A structure that holds metadata for a serialized property.
Definition Serialization.hpp:85