/
serialization_config.go
145 lines (128 loc) · 5.69 KB
/
serialization_config.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
/*
* Copyright (c) 2008-2021, Hazelcast, Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License")
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package serialization
import (
"reflect"
ihzerrors "github.com/hazelcast/hazelcast-go-client/internal/hzerrors"
)
// Config contains the serialization configuration of a Hazelcast instance.
type Config struct {
globalSerializer Serializer
customSerializers map[reflect.Type]Serializer
identifiedDataSerializableFactories []IdentifiedDataSerializableFactory
portableFactories []PortableFactory
classDefinitions []*ClassDefinition
// PortableVersion will be used to differentiate two versions of the same struct that have changes on the struct,
// like adding/removing a field or changing a type of a field.
PortableVersion int32 `json:",omitempty"`
// LittleEndian sets byte order to Little Endian. Default is false.
LittleEndian bool `json:",omitempty"`
}
func (c *Config) Clone() Config {
c.ensureCustomSerializers()
idFactories := make([]IdentifiedDataSerializableFactory, len(c.identifiedDataSerializableFactories))
copy(idFactories, c.identifiedDataSerializableFactories)
pFactories := make([]PortableFactory, len(c.portableFactories))
copy(pFactories, c.portableFactories)
defs := make([]*ClassDefinition, len(c.classDefinitions))
copy(defs, c.classDefinitions)
serializers := map[reflect.Type]Serializer{}
for k, v := range c.customSerializers {
serializers[k] = v
}
return Config{
LittleEndian: c.LittleEndian,
identifiedDataSerializableFactories: idFactories,
portableFactories: pFactories,
PortableVersion: c.PortableVersion,
customSerializers: serializers,
globalSerializer: c.globalSerializer,
classDefinitions: defs,
}
}
func (c *Config) Validate() error {
return nil
}
// SetIdentifiedDataSerializableFactories adds zore or more identified data serializable factories.
// Identified data serializable factories is a map of factory IDs and corresponding IdentifiedDataSerializable factories.
func (b *Config) SetIdentifiedDataSerializableFactories(factories ...IdentifiedDataSerializableFactory) {
b.identifiedDataSerializableFactories = append(b.identifiedDataSerializableFactories, factories...)
}
// IdentifiedDataSerializableFactories returns a copy of identified data serializable factories.
// Identified data serializable factories is a map of factory IDs and corresponding IdentifiedDataSerializable factories.
func (b *Config) IdentifiedDataSerializableFactories() []IdentifiedDataSerializableFactory {
fs := make([]IdentifiedDataSerializableFactory, len(b.identifiedDataSerializableFactories))
copy(fs, b.identifiedDataSerializableFactories)
return fs
}
// SetPortableFactories adds zero or more portable factories.
// Portable factories is a map of factory IDs and corresponding Portable factories.
func (b *Config) SetPortableFactories(factories ...PortableFactory) {
b.portableFactories = append(b.portableFactories, factories...)
}
// PortableFactories returns a copy of portable factories
// portable factories is a map of factory IDs and corresponding Portable factories.
func (b *Config) PortableFactories() []PortableFactory {
fs := make([]PortableFactory, len(b.portableFactories))
copy(fs, b.portableFactories)
return fs
}
// SetCustomSerializer adds a customer serializer for the given type.
// custom serializers is a map of object types and corresponding custom serializers.
func (b *Config) SetCustomSerializer(t reflect.Type, serializer Serializer) error {
b.ensureCustomSerializers()
if serializer.ID() <= 0 {
return ihzerrors.NewIllegalArgumentError("serializerID must be positive", nil)
}
b.customSerializers[t] = serializer
return nil
}
// CustomSerializers returns a copy of custom serializers.
// custom serializers is a map of object types and corresponding custom serializers.
func (b *Config) CustomSerializers() map[reflect.Type]Serializer {
b.ensureCustomSerializers()
sers := map[reflect.Type]Serializer{}
for k, v := range b.customSerializers {
sers[k] = v
}
return sers
}
// SetClassDefinitions adds zore or more class definitions for portable factories.
func (b *Config) SetClassDefinitions(definitions ...*ClassDefinition) {
b.classDefinitions = append(b.classDefinitions, definitions...)
}
// ClassDefinitions returns a copy of class definitions.
// class definitions contains classDefinitions for portable structs.
func (b *Config) ClassDefinitions() []*ClassDefinition {
cds := make([]*ClassDefinition, len(b.classDefinitions))
copy(cds, b.classDefinitions)
return cds
}
// SetGlobalSerializer sets the global serializer.
// Global serializer is the serializer that will be used if no other serializer is applicable.
func (b *Config) SetGlobalSerializer(serializer Serializer) {
b.globalSerializer = serializer
}
// GlobalSerializer returns the global serializer.
// Global serializer is the serializer that will be used if no other serializer is applicable.
func (b *Config) GlobalSerializer() Serializer {
return b.globalSerializer
}
func (b *Config) ensureCustomSerializers() {
if b.customSerializers == nil {
b.customSerializers = map[reflect.Type]Serializer{}
}
}