我想创建一个通用序列化器,能够序列化和反序列化以特定强制格式提供的数据。假设我已经实现了两个带有属性的数据结构(用于 JSON 和 MessagePack)和一个简单的序列化器实现:
[Serializable]
public class JsonDataset
{
[JsonProperty("frames")]
public List<JsonHandFrame> Frames { get; set; }
}
[Serializable]
public class JsonHandFrame
{
[JsonProperty("leftHand")]
public JsonHand LeftHand { get; set; }
[JsonProperty("rightHand")]
public JsonHand RightHand { get; set; }
}
[Serializable]
public class JsonHand
{
[JsonProperty("joints")]
public JsonJoint[] Joints { get; set; }
}
[Serializable]
public class JsonJoint
{
[JsonProperty("x")]
public float JsonX { get; set; }
[JsonProperty("y")]
public float JsonY { get; set; }
[JsonProperty("z")]
public float JsonZ { get; set; }
}
[MessagePackObject]
public class MPDataset
{
[Key(0)]
public List<MPHandFrame> Frames { get; set; }
}
[MessagePackObject]
public class MPHandFrame
{
[Key(0)]
public Hand MPLeftHand { get; set; }
[Key(1)]
public Hand MPRightHand { get; set; }
}
[MessagePackObject]
public class MPHand
{
[Key(0)]
public MPJoint[] Joints { get; set; }
}
[MessagePackObject]
public class MPJoint
{
[Key(0)]
public float MPX { get; set; }
[Key(1)]
public float MPY { get; set; }
[Key(2)]
public float MPZ { get; set; }
}
public interface ISerializer<T>
{
public byte[] Serialize(T handDataset);
public T Deserialize(byte[] data);
}
public class JsonSerializer: ISerializer<JsonDataset>
{
public byte[] Serialize(JsonDataset handDataset)
{
string json = JsonConvert.SerializeObject(handDataset);
return System.Text.Encoding.UTF8.GetBytes(json);
}
public JsonDataset Deserialize(byte[] data)
{
string json = System.Text.Encoding.UTF8.GetString(data);
return JsonConvert.DeserializeObject<JsonDataset>(json);
}
}
public class MessagePackSerializer: ISerializer<MPDataset>
{
public byte[] Serialize(MPDataset handDataset)
{
return MessagePack.MessagePackSerializer.Serialize(handDataset);
}
public MPDataset Deserialize(byte[] data)
{
return MessagePack.MessagePackSerializer.Deserialize<MPDataset>(data);
}
}
可以看出,在描述类型时存在大量代码重复,尤其是在添加新类型时。当使用继承添加新类型时,是否有某种方法可以使用接口或抽象类来强制执行此特定数据结构?在这种情况下有什么设计模式可以提供帮助吗?我尝试了一些使用接口和抽象类的实现,但我总是得到建议隐藏属性或允许无效数据类型组合的代码(例如,如果我最终为层次结构中的每个对象创建一个接口,我就可以分配
MLHandFrames
到 JsonDataset
,反之亦然)。如有任何建议,我们将不胜感激。
通过向每个类添加多个属性来解决,如下所示:
[Serializable]
[MessagePackObject]
public class JsonDataset
{
[JsonProperty("frames")]
[Key(0)]
public List<JsonHandFrame> Frames { get; set; }
}
[Serializable]
[MesssagePackObject]
public class JsonHandFrame
{
[JsonProperty("leftHand")]
[Key(0)]
public JsonHand LeftHand { get; set; }
[Key(1)]
[JsonProperty("rightHand")]
public JsonHand RightHand { get; set; }
}
[Serializable]
[MesssagePackObject]
public class JsonHand
{
[JsonProperty("joints")]
[Key(0)]
public JsonJoint[] Joints { get; set; }
}
[Serializable]
[MesssagePackObject]
public class JsonJoint
{
[JsonProperty("x")]
[Key(0)]
public float JsonX { get; set; }
[JsonProperty("y")]
[Key(1)]
public float JsonY { get; set; }
[JsonProperty("z")]
[Key(2)]
public float JsonZ { get; set; }
}