serializerUtil
A very simple utility for serializing and deserializing data types.
This utility supports the following data types:
- CFrame
- Vector3
- Vector2
- BrickColor
- Color3
- Enum
- EnumItem
- Axes
- CatalogSearchParams
- ColorSequence
- ColorSequenceKeypoint
- NumberSequence
- NumberSequenceKeypoint
- Faces
- Axes
- NumberRange
- PathWaypoint
- Region3
- Region3init16
- TweenInfo
- UDim
- UDim2
- Vector3int16
- Vector2int16
- Region3int16
- Font
- Rect
- DateTime
- PhysicalProperties
Types
ClassDataType
type
ClassDataType =
{
valueType:
any
,
serializer:
(
value:
any
,
intermediateSerializedData:
{
}
)
→
(
)
,
deserializer:
(
serializedData:
{
}
)
→
(
)
,
}
Properties
customValueType
serializerUtil.customValueType:
"serDesCustomValueType"
A constant to be used as a key in tables, to represent some type which this utility can easily know about when serializing and deserializing values.
local spmeTable = {
-- Allow the serializer utility module to know the "type" of this table
[serializerUtil.customValueType] = "uniqueType"
}
Functions
serialize
serializerUtil.
serialize
(
value:
any
) →
(
)
Serializes the given vale, if it can be serialized. If it can't be serialized, then the value it self is returned.
local serializedValue = serializerUtil.serializer(150)
print(serializedValue) --> 150 (can't serialize a number!)
local serializedValue = serializerUtil.serializer(CFrame.new(5,5,5))
print(serializedValue) --> {...} (serialized data)
deserialize
serializerUtil.
deserialize
(
serializedData:
any
) →
(
)
Deserializes the given serialized value, if it can be deserialized. If it can't be deserialized, then the value it self is returned.
local serializedValue = serializerUtil.serializer(CFrame.new(5,5,5))
print(serializerUtil.deserialize(serializedValue)) --> CFrame (5,5,5)
print(serializerUtil.deserialize(15)) --> 15 (Can't deserialize a non-serialized value)
addClassDataType
Adds a class data type to the serializer. A class data type (in the context of this utility) is simply an object which you can use to add your own custom serializers and deserializers.
-- In this project X, we have a funny which we would like to serialize
-- and deserialize according to how our game is structured;
local someUniqueTable = {
[serializerUtil.customValueType] = "TheUniqueTable"
}
serializerUtil.addClassDataType({
valueType = "TheUniqueTable",
serializer = {
run = function(uniqueTable, intermediateSerializedData)
intermediateSerializedData.component = {1, 2, 3, 4, 5, 6}
end,
},
deserializer = {
run = function(serializedUniqueTable)
return serializedUniqueTable.component
end,
},
})
local serializedTable = serializerUtil.serialize(someUniqueTable)
print(serializerUtil.deserialize(serializedTable)) --> {1, 2, 3, 4, 5, 6}
Override default data types
Currently this utility supports a lot of data types to serialize and serialize - however you can override them too with your own serializers and deserializers for them, for e.g:
-- Let's just override the serializer and deserializer for the `Vector3` data type
-- in favour of our own:
serializerUtil.addClassDataType({
valueType = "Vector3",
serializer = {
run = function(vector3, intermediateSerializedData)
intermediateSerializedData.components = {vector3.X, vector3.Y, vector3.Z}
end,
},
deserializer = {
run = function(serializedVector3)
return Vector3.new(table.unpack(serializedVector3.components))
end,
},
})
This gives you flexibility to append your own serializer and deserializer for specific data types as per your game's need!
addClassDataTypes
Shorthand for adding multiple class data types in 1 go. serializerUtil.addClass is called
for every class data type in classDataTypes
.
local classDataTypes = {
{
valueType = "Vector3",
serializer = {
run = function(vector3, intermediateSerializedData)
intermediateSerializedData.components = {vector3.X, vector3.Y, vector.Z}
end,
},
deserializer = {
run = function(serializedVector3)
return Vector3.new(table.unpack(serializedVector3.components))
end,
},
},
{
valueType = "Vector2",
serializer = {
run = function(vector2, intermediateSerializedData)
intermediateSerializedData.components = {vector2.X, vector2.Y}
end,
},
deserializer = {
run = function(serializedVector2)
return Vector2.new(table.unpack(serializedVector2.components))
end,
},
}
}
serializerUtil.addClassDataTypes(classDataTypes)
serializeTableDeep
serializerUtil.
serializeTableDeep
(
deserializedTable:
{
[
any
]
:
any
}
) →
(
)
Deep serializes all keys and values in the given table via serializerUtil.serialize.
local tabl = {bo = Enum.Keycode.A}
local serializedTable = serializerUtil.serializeTableDeep(tabl)
print(serializedTable) --> {bo: {...}} (serialized)
deserializeTableDeep
serializerUtil.
deserializeTableDeep
(
serializedTable:
{
[
any
]
:
any
}
) →
(
)
Deep - deserializes all keys and values in the given table via serializerUtil.deserialize.
local tabl = {bo = Enum.Keycode.A}
local serializedTable = serializerUtil.serializeTableDeep(tabl)
print(serializerUtil.deserializeTableDeep(serializedTable)) --> {bo: Enum.Keycode.A} (deserialized)