diff --git a/src/kiwano/2d/Actor.cpp b/src/kiwano/2d/Actor.cpp index 7f7521b2..1f14d594 100644 --- a/src/kiwano/2d/Actor.cpp +++ b/src/kiwano/2d/Actor.cpp @@ -220,6 +220,20 @@ bool Actor::DispatchEvent(Event* evt) return true; } +void Actor::DoSerialize(Serializer* serializer) const +{ + ObjectBase::DoSerialize(serializer); + (*serializer) << visible_ << update_pausing_ << cascade_opacity_ << responsible_ << z_order_ << opacity_ << anchor_ + << size_ << transform_; +} + +void Actor::DoDeserialize(Deserializer* deserializer) +{ + ObjectBase::DoDeserialize(deserializer); + (*deserializer) >> visible_ >> update_pausing_ >> cascade_opacity_ >> responsible_ >> z_order_ >> opacity_ + >> anchor_ >> size_ >> transform_; +} + bool Actor::HandleEvent(Event* evt) { if (!components_.IsEmpty()) diff --git a/src/kiwano/2d/Actor.h b/src/kiwano/2d/Actor.h index 1c86786b..459f1f34 100644 --- a/src/kiwano/2d/Actor.h +++ b/src/kiwano/2d/Actor.h @@ -446,6 +446,14 @@ public: /// @return 是否继续分发该事件 virtual bool DispatchEvent(Event* evt); + /// \~chinese + /// @brief 序列化 + void DoSerialize(Serializer* serializer) const override; + + /// \~chinese + /// @brief 反序列化 + void DoDeserialize(Deserializer* deserializer) override; + /// \~chinese /// @brief 设置默认锚点 static void SetDefaultAnchor(float anchor_x, float anchor_y); diff --git a/src/kiwano/core/Serializable.h b/src/kiwano/core/Serializable.h index 52aafecd..822cb6cd 100644 --- a/src/kiwano/core/Serializable.h +++ b/src/kiwano/core/Serializable.h @@ -20,6 +20,7 @@ #pragma once #include +#include namespace kiwano { @@ -397,19 +398,41 @@ public: virtual void DoDeserialize(Deserializer* deserializer) = 0; }; -/// \~chinese -/// @brief 使用序列化克隆对象 -template -void SerializedClone(const _Ty& src, _Ty2& dest) -{ - static_assert(std::is_base_of::value && std::is_base_of::value, - "Serialized object must be serializable."); - String bytes = src.Serialize(); - if (!bytes.empty()) - { - dest.Deserialize(bytes); - } +// +// operator<< for Serializer +// +inline Serializer& operator<<(Serializer& serializer, const math::Vec2T& vec) +{ + return serializer << vec.x << vec.y; +} + +inline Serializer& operator<<(Serializer& serializer, const math::RectT& rect) +{ + return serializer << rect.left_top << rect.right_bottom; +} + +inline Serializer& operator<<(Serializer& serializer, const math::TransformT& transform) +{ + return serializer << transform.position << transform.rotation << transform.scale << transform.skew; +} + +// +// operator>> for Deserializer +// +inline Deserializer& operator>>(Deserializer& deserializer, math::Vec2T& vec) +{ + return deserializer >> vec.x >> vec.y; +} + +inline Deserializer& operator>>(Deserializer& deserializer, math::RectT& rect) +{ + return deserializer >> rect.left_top >> rect.right_bottom; +} + +inline Deserializer& operator>>(Deserializer& deserializer, math::TransformT& transform) +{ + return deserializer >> transform.position >> transform.rotation >> transform.scale >> transform.skew; } } // namespace kiwano