使用 C# 中的属性的自定义数据的通用序列化器

问题描述 投票:0回答:1

我想创建一个通用序列化器,能够序列化和反序列化以特定强制格式提供的数据。假设我已经实现了两个带有属性的数据结构(用于 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
,反之亦然)。如有任何建议,我们将不胜感激。

c# serialization attributes deserialization
1个回答
0
投票

通过向每个类添加多个属性来解决,如下所示:

[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; }
}
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.