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

Ste*_*han 5 c# sqlite serialization sqlite-net

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

[Ignore]
public Date Date { get; set; }

[PrimaryKey]
public DateTime DateInternal
{
    get { return Date.ToDateTime(); }
    set { Date = new Date(value); }
}
Run Code Online (Sandbox Code Playgroud)

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

实际问题:我该如何改善。即,我如何Date直接存储序列化版本。它应该以某种方式Date可以用作主键。对于我而言,将所有属性都放在Date表的单个列中并不重要。我只想将Date自己存储在一列中。

目前的研究:在尝试向Google寻求答案的过程中,我偶然发现了SQLite.net的ISerializable界面,但由于该serialize方法只有一种方法而没有deserialize方法,因此我不确定如何使用它。

namespace SQLite.Net
{
    public interface ISerializable<T>
    {
        [PublicAPI]
        T Serialize();
    }
}
Run Code Online (Sandbox Code Playgroud)

bun*_*ive 2

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

解决方案:您的可序列化类需要将可序列化类型作为参数的构造函数

一个例子:

带两个整数的类:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

在 SQLite 持久化类中使用:

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

    public MySerializable MySerValues { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)