12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- import { CLASSNAME_ATTRIBUTE } from "./Strings"
-
- export abstract class DeserializerFactory {
- static entityClasses = {}
-
- static from(object: any) {
- if(!object){
- return
- }
-
- if(typeof object !== 'object'){ //definitely not a class object
- return object
- }
-
- if(Array.isArray(object)){
- return object.map(DeserializerFactory.from)
- }
-
- const clazz = DeserializerFactory.entityClasses[object[CLASSNAME_ATTRIBUTE]]
- delete object[CLASSNAME_ATTRIBUTE]
-
- if(!clazz){ //anonymous object or class not registered as @Serializable
- Object.keys(object).forEach(key => {
- object[key] = DeserializerFactory.from(object[key])
- })
- return object
- }
-
- const obj = new clazz()
- Object.keys(object).forEach(key => {
- obj[key] = DeserializerFactory.from(object[key])
- })
- return obj
- }
-
-
-
- static makeDeserializable(object: any){
- if(!object)
- return
-
- if(typeof object !== 'object')
- return object
-
- if(object.constructor.name === 'Object'){
- Object.keys(object).forEach(key => {
- object[key] = DeserializerFactory.makeDeserializable(object[key])
- })
- return object
- }
-
- object[CLASSNAME_ATTRIBUTE] = object.constructor.name
- Object.keys(object).forEach(key => {
- object[key] = DeserializerFactory.makeDeserializable(object[key])
- })
-
- return object
- }
- }
-
- export function Serializable(attr?: any) {
- return function _Serializable<T extends { new(...args: any[]): {} }>(clazz: T) {
- DeserializerFactory.entityClasses[clazz.name] = clazz
-
- return clazz
- }
- }
|