SQLite.net中的可序列化数据类型

本文关键字:序列化 数据类型 net SQLite | 更新日期: 2023-09-27 17:59:41

简介:在SQLite.net支持的SQLite数据库中(在WP8.1 SL上,但这在这里不重要),我正在添加基于给定对象的数据。此对象包含一个名为Date的自定义类型。到目前为止,我不将该属性存储在DB中,而是使用另一个属性作为解决方法。

[Ignore]
public Date Date { get; set; }
[PrimaryKey]
public DateTime DateInternal
{
    get { return Date.ToDateTime(); }
    set { Date = new Date(value); }
}

虽然这很好,但我觉得这不是最好的方法。

实际问题:我该如何改进。即,如何直接存储Date的序列化版本。它应该在某种程度上使得Date可以用作主键。让Date中的所有属性在表中的单列中可用对我来说并不重要。我想将Date本身存储在一列中。

当前研究:在谷歌上搜索答案时,我偶然发现了SQLite.net的ISerializable接口,但我不确定如何使用它,因为它只有serialize方法,没有deserialize方法。

namespace SQLite.Net
{
    public interface ISerializable<T>
    {
        [PublicAPI]
        T Serialize();
    }
}

SQLite.net中的可序列化数据类型

已知问题:在ISerializable类中至少应有一个注释,说明任何使用要求。

  • 因为没有,所以提交了此SQLite.Net-PCL问题。它还提到了修复(例如,满足接口的构造函数假设)

解决方案:您的可序列化类需要ctor,它将可序列化类型作为参数

示例:

等级w/两个int:

public struct MySerializable : ISerializable<string>
{
    public int Value1 { get; set; }
    public int Value2 { get; set; }
    // ****See Here: Ctor taking serialized type to restore field vals
    public MySerializable(string serializedData) : this()
    {
        var stringVals = serializedData.Split(',');
        Value1 = Convert.ToInt32(stringVals[0]);
        Value2 = Convert.ToInt32(stringVals[1]);
    }
    public override string ToString()
    {
        return string.Format("{0},{1}", Value1, Value2);
    }
    // ****See  Here: serializing field vals to string
    public string Serialize()
    {
        return ToString();
    }
}

在SQLite持久化类中使用:

public class MyTable
{
    [PrimaryKey, AutoIncrement]
    public int Id { get; private set; }
    public MySerializable MySerValues { get; private set; }
}