Caffa  1.1.0
C++ Application Framework for Embedded Systems with introspection
cafJsonSerializer.h
1 // ##################################################################################################
2 //
3 // Caffa
4 // Copyright (C) 2021- 3D-Radar AS
5 //
6 // GNU Lesser General Public License Usage
7 // This library is free software; you can redistribute it and/or modify
8 // it under the terms of the GNU Lesser General Public License as published by
9 // the Free Software Foundation; either version 2.1 of the License, or
10 // (at your option) any later version.
11 //
12 // This library is distributed in the hope that it will be useful, but WITHOUT ANY
13 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 // FITNESS FOR A PARTICULAR PURPOSE.
15 //
16 // See the GNU Lesser General Public License at <<http://www.gnu.org/licenses/lgpl-2.1.html>>
17 // for more details.
18 //
19 #pragma once
20 
21 #include "cafObjectHandle.h"
22 
23 #include <nlohmann/json.hpp>
24 
25 #include <chrono>
26 #include <fstream>
27 #include <set>
28 #include <string>
29 
30 namespace caffa
31 {
32 class FieldHandle;
33 class ObjectFactory;
34 
39 {
40 public:
41  enum class SerializationType
42  {
43  DATA_FULL,
44  DATA_SKELETON,
45  SCHEMA,
46  PATH
47  };
48 
49  using FieldSelector = std::function<bool( const FieldHandle* )>;
50 
51  static std::string serializationTypeLabel( SerializationType type );
52 
53 public:
66  template <DerivesFromObjectHandle ObjectType>
67  std::shared_ptr<ObjectType> cloneObject( const ObjectType* object ) const
68  {
69  auto basePointer = copyAndCastBySerialization( object, ObjectType::classKeywordStatic() );
70  return std::dynamic_pointer_cast<ObjectType>( basePointer );
71  }
72 
81 
89  JsonSerializer& setSerializationType( SerializationType type );
90 
99 
104  ObjectFactory* objectFactory() const;
105 
110  FieldSelector fieldSelector() const;
111 
116  SerializationType serializationType() const;
117 
123  bool serializeUuids() const;
124 
125  JsonSerializer& setClient( bool client );
126  bool isClient() const;
127 
134  std::string readUUIDFromObjectString( const std::string& string ) const;
135 
141  void readObjectFromString( ObjectHandle* object, const std::string& string ) const;
142 
148  std::string writeObjectToString( const ObjectHandle* object ) const;
149 
155  std::shared_ptr<ObjectHandle> copyBySerialization( const ObjectHandle* object ) const;
156 
165  std::shared_ptr<ObjectHandle> copyAndCastBySerialization( const ObjectHandle* object,
166  const std::string& destinationClassKeyword ) const;
167 
173  std::shared_ptr<ObjectHandle> createObjectFromString( const std::string& string ) const;
174 
180  void readStream( ObjectHandle* object, std::istream& stream ) const;
181 
187  void writeStream( const ObjectHandle* object, std::ostream& stream ) const;
188 
189  void readObjectFromJson( ObjectHandle* object, const nlohmann::json& jsonObject ) const;
190  void writeObjectToJson( const ObjectHandle* object, nlohmann::json& jsonObject ) const;
191 
192 protected:
193  bool m_client;
194  ObjectFactory* m_objectFactory;
195  FieldSelector m_fieldSelector;
196 
197  SerializationType m_serializationType;
198  bool m_serializeUuids;
199 };
200 
201 } // End of namespace caffa
202 
206 namespace nlohmann
207 {
208 template <typename Clock, typename Duration>
209 struct adl_serializer<std::chrono::time_point<Clock, Duration>>
210 {
211  static void to_json( json& j, const std::chrono::time_point<Clock, Duration>& tp )
212  {
213  j = std::chrono::duration_cast<Duration>( tp.time_since_epoch() ).count();
214  }
215 
216  static void from_json( const json& j, std::chrono::time_point<Clock, Duration>& tp )
217  {
218  Duration duration( j.get<int64_t>() );
219  tp = std::chrono::steady_clock::time_point( duration );
220  }
221 };
222 
226 template <typename IntType, typename Period>
227 struct adl_serializer<std::chrono::duration<IntType, Period>>
228 {
229  static void to_json( json& j, const std::chrono::duration<IntType, Period>& duration )
230  {
231  j = static_cast<IntType>( duration.count() );
232  }
233 
234  static void from_json( const json& j, std::chrono::duration<IntType, Period>& duration )
235  {
236  duration = std::chrono::duration<IntType, Period>( j.get<IntType>() );
237  }
238 };
239 
240 } // namespace nlohmann
SerializationType serializationType() const
Definition: cafJsonSerializer.cpp:92
std::string writeObjectToString(const ObjectHandle *object) const
Definition: cafJsonSerializer.cpp:345
void writeStream(const ObjectHandle *object, std::ostream &stream) const
Definition: cafJsonSerializer.cpp:437
JsonSerializer(ObjectFactory *objectFactory=nullptr)
Definition: cafJsonSerializer.cpp:56
JsonSerializer & setFieldSelector(FieldSelector fieldSelector)
Definition: cafJsonSerializer.cpp:64
void readObjectFromString(ObjectHandle *object, const std::string &string) const
Definition: cafJsonSerializer.cpp:336
JsonSerializer & setSerializeUuids(bool serializeUuids)
Definition: cafJsonSerializer.cpp:76
ObjectFactory * objectFactory() const
Definition: cafJsonSerializer.cpp:82
Definition: cafObjectFactory.h:36
JsonSerializer & setSerializationType(SerializationType type)
Definition: cafJsonSerializer.cpp:70
Definition: cafJsonSerializer.h:206
bool serializeUuids() const
Definition: cafJsonSerializer.cpp:97
Definition: cafObjectHandle.h:47
std::shared_ptr< ObjectHandle > copyAndCastBySerialization(const ObjectHandle *object, const std::string &destinationClassKeyword) const
Definition: cafJsonSerializer.cpp:368
FieldSelector fieldSelector() const
Definition: cafJsonSerializer.cpp:87
Definition: cafJsonSerializer.h:38
std::shared_ptr< ObjectType > cloneObject(const ObjectType *object) const
Definition: cafJsonSerializer.h:67
std::shared_ptr< ObjectHandle > createObjectFromString(const std::string &string) const
Definition: cafJsonSerializer.cpp:391
void readStream(ObjectHandle *object, std::istream &stream) const
Definition: cafJsonSerializer.cpp:426
Main Caffa namespace.
Definition: cafApplication.h:30
std::string readUUIDFromObjectString(const std::string &string) const
Definition: cafJsonSerializer.cpp:321
std::shared_ptr< ObjectHandle > copyBySerialization(const ObjectHandle *object) const
Definition: cafJsonSerializer.cpp:355