Skip to content

Commit 6703f6b

Browse files
committed
Add deserialization type argument
1 parent ae02574 commit 6703f6b

File tree

1 file changed

+27
-27
lines changed

1 file changed

+27
-27
lines changed

SQLiteSharp/Orm.cs

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@ public class Orm {
1616
public Orm() {
1717
AddDefaultTypeSerializers();
1818
}
19-
public void RegisterType(Type type, SqliteType sqliteType, Func<object, SqliteValue> serialize, Func<SqliteValue, object?> deserialize) {
19+
public void RegisterType(Type type, SqliteType sqliteType, Func<object, SqliteValue> serialize, Func<SqliteValue, Type, object?> deserialize) {
2020
TypeSerializers[type] = new TypeSerializer(type, sqliteType, serialize, deserialize);
2121
}
22-
public void RegisterType<T>(SqliteType sqliteType, Func<T, SqliteValue> serialize, Func<SqliteValue, object> deserialize) {
23-
RegisterType(typeof(T), sqliteType, (object clr) => serialize((T)clr), (SqliteValue sqlite) => deserialize(sqlite));
22+
public void RegisterType<T>(SqliteType sqliteType, Func<T, SqliteValue> serialize, Func<SqliteValue, Type, object> deserialize) {
23+
RegisterType(typeof(T), sqliteType, (object clr) => serialize((T)clr), (SqliteValue sqlite, Type clrType) => deserialize(sqlite, clrType));
2424
}
2525
public bool UnregisterType(Type type) {
2626
return TypeSerializers.TryRemove(type, out _);
@@ -47,7 +47,7 @@ public TypeSerializer GetTypeSerializer(Type type) {
4747
public object? ReadColumn(Sqlite3Statement statement, int index, Type type) {
4848
TypeSerializer typeSerializer = GetTypeSerializer(type);
4949
SqliteValue value = SQLiteRaw.GetColumnValue(statement, index);
50-
return typeSerializer.Deserialize(value);
50+
return typeSerializer.Deserialize(value, type);
5151
}
5252
public void BindParameter(Sqlite3Statement statement, int index, object? value) {
5353
if (value is null) {
@@ -121,107 +121,107 @@ private void AddDefaultTypeSerializers() {
121121
RegisterType<bool>(
122122
sqliteType: SqliteType.Integer,
123123
serialize: (bool clr) => clr ? 1 : 0,
124-
deserialize: (SqliteValue sqlite) => (int)sqlite.AsInteger != 0
124+
deserialize: (SqliteValue sqlite, Type clrType) => (int)sqlite.AsInteger != 0
125125
);
126126
RegisterType<string>(
127127
sqliteType: SqliteType.Text,
128128
serialize: (string clr) => clr,
129-
deserialize: (SqliteValue sqlite) => sqlite.AsText
129+
deserialize: (SqliteValue sqlite, Type clrType) => sqlite.AsText
130130
);
131131
RegisterType<byte>(
132132
sqliteType: SqliteType.Integer,
133133
serialize: (byte clr) => clr,
134-
deserialize: (SqliteValue sqlite) => (byte)sqlite.AsInteger
134+
deserialize: (SqliteValue sqlite, Type clrType) => (byte)sqlite.AsInteger
135135
);
136136
RegisterType<sbyte>(
137137
sqliteType: SqliteType.Integer,
138138
serialize: (sbyte clr) => clr,
139-
deserialize: (SqliteValue sqlite) => (sbyte)sqlite.AsInteger
139+
deserialize: (SqliteValue sqlite, Type clrType) => (sbyte)sqlite.AsInteger
140140
);
141141
RegisterType<short>(
142142
sqliteType: SqliteType.Integer,
143143
serialize: (short clr) => clr,
144-
deserialize: (SqliteValue sqlite) => (short)sqlite.AsInteger
144+
deserialize: (SqliteValue sqlite, Type clrType) => (short)sqlite.AsInteger
145145
);
146146
RegisterType<ushort>(
147147
sqliteType: SqliteType.Integer,
148148
serialize: (ushort clr) => clr,
149-
deserialize: (SqliteValue sqlite) => (ushort)sqlite.AsInteger
149+
deserialize: (SqliteValue sqlite, Type clrType) => (ushort)sqlite.AsInteger
150150
);
151151
RegisterType<int>(
152152
sqliteType: SqliteType.Integer,
153153
serialize: (int clr) => clr,
154-
deserialize: (SqliteValue sqlite) => (int)sqlite.AsInteger
154+
deserialize: (SqliteValue sqlite, Type clrType) => (int)sqlite.AsInteger
155155
);
156156
RegisterType<uint>(
157157
sqliteType: SqliteType.Integer,
158158
serialize: (uint clr) => clr,
159-
deserialize: (SqliteValue sqlite) => (uint)sqlite.AsInteger
159+
deserialize: (SqliteValue sqlite, Type clrType) => (uint)sqlite.AsInteger
160160
);
161161
RegisterType<long>(
162162
sqliteType: SqliteType.Integer,
163163
serialize: (long clr) => clr,
164-
deserialize: (SqliteValue sqlite) => sqlite.AsInteger
164+
deserialize: (SqliteValue sqlite, Type clrType) => sqlite.AsInteger
165165
);
166166
RegisterType<ulong>(
167167
sqliteType: SqliteType.Integer,
168168
serialize: (ulong clr) => clr,
169-
deserialize: (SqliteValue sqlite) => (ulong)sqlite.AsInteger
169+
deserialize: (SqliteValue sqlite, Type clrType) => (ulong)sqlite.AsInteger
170170
);
171171
RegisterType<char>(
172172
sqliteType: SqliteType.Integer,
173173
serialize: (char clr) => clr,
174-
deserialize: (SqliteValue sqlite) => sqlite.AsInteger
174+
deserialize: (SqliteValue sqlite, Type clrType) => sqlite.AsInteger
175175
);
176176
RegisterType<float>(
177177
sqliteType: SqliteType.Integer,
178178
serialize: (float clr) => clr,
179-
deserialize: (SqliteValue sqlite) => (float)sqlite.AsFloat
179+
deserialize: (SqliteValue sqlite, Type clrType) => (float)sqlite.AsFloat
180180
);
181181
RegisterType<double>(
182182
sqliteType: SqliteType.Integer,
183183
serialize: (double clr) => clr,
184-
deserialize: (SqliteValue sqlite) => sqlite.AsFloat
184+
deserialize: (SqliteValue sqlite, Type clrType) => sqlite.AsFloat
185185
);
186186
RegisterType<TimeSpan>(
187187
sqliteType: SqliteType.Integer,
188188
serialize: (TimeSpan clr) => clr.Ticks,
189-
deserialize: (SqliteValue sqlite) => new TimeSpan(sqlite.AsInteger)
189+
deserialize: (SqliteValue sqlite, Type clrType) => new TimeSpan(sqlite.AsInteger)
190190
);
191191
RegisterType<DateTime>(
192192
sqliteType: SqliteType.Integer,
193193
serialize: (DateTime clr) => clr.Ticks,
194-
deserialize: (SqliteValue sqlite) => new DateTime(sqlite.AsInteger)
194+
deserialize: (SqliteValue sqlite, Type clrType) => new DateTime(sqlite.AsInteger)
195195
);
196196
RegisterType<Uri>(
197197
sqliteType: SqliteType.Text,
198198
serialize: (Uri clr) => clr.AbsoluteUri,
199-
deserialize: (SqliteValue sqlite) => new Uri(sqlite.AsText)
199+
deserialize: (SqliteValue sqlite, Type clrType) => new Uri(sqlite.AsText)
200200
);
201201
RegisterType<byte[]>(
202202
sqliteType: SqliteType.Blob,
203203
serialize: (byte[] clr) => clr,
204-
deserialize: (SqliteValue sqlite) => sqlite.AsBlob
204+
deserialize: (SqliteValue sqlite, Type clrType) => sqlite.AsBlob
205205
);
206206
RegisterType<IEnumerable<byte>>(
207207
sqliteType: SqliteType.Blob,
208208
serialize: (IEnumerable<byte> clr) => clr.ToArray(),
209-
deserialize: (SqliteValue sqlite) => sqlite.AsBlob.ToList()
209+
deserialize: (SqliteValue sqlite, Type clrType) => sqlite.AsBlob.ToList()
210210
);
211211
RegisterType<Enum>(
212212
sqliteType: SqliteType.Integer,
213213
serialize: (Enum clr) => Convert.ToInt64(clr),
214-
deserialize: (SqliteValue sqlite) => sqlite.AsInteger
214+
deserialize: (SqliteValue sqlite, Type clrType) => Enum.ToObject(clrType, sqlite.AsInteger)
215215
);
216216
RegisterType<StringBuilder>(
217217
sqliteType: SqliteType.Text,
218218
serialize: (StringBuilder clr) => clr.ToString(),
219-
deserialize: (SqliteValue sqlite) => sqlite.AsText
219+
deserialize: (SqliteValue sqlite, Type clrType) => sqlite.AsText
220220
);
221221
RegisterType<Guid>(
222222
sqliteType: SqliteType.Text,
223223
serialize: (Guid clr) => clr.ToString(),
224-
deserialize: (SqliteValue sqlite) => sqlite.AsText
224+
deserialize: (SqliteValue sqlite, Type clrType) => sqlite.AsText
225225
);
226226
}
227227
private static string GetTypeSql(SqliteType sqliteType) => sqliteType switch {
@@ -234,9 +234,9 @@ private void AddDefaultTypeSerializers() {
234234
};
235235
}
236236

237-
public readonly struct TypeSerializer(Type clrType, SqliteType sqliteType, Func<object, SqliteValue> serialize, Func<SqliteValue, object?> deserialize) {
237+
public readonly struct TypeSerializer(Type clrType, SqliteType sqliteType, Func<object, SqliteValue> serialize, Func<SqliteValue, Type, object?> deserialize) {
238238
public Type ClrType { get; } = clrType;
239239
public SqliteType SqliteType { get; } = sqliteType;
240240
public Func<object, SqliteValue> Serialize { get; } = serialize;
241-
public Func<SqliteValue, object?> Deserialize { get; } = deserialize;
241+
public Func<SqliteValue, Type, object?> Deserialize { get; } = deserialize;
242242
}

0 commit comments

Comments
 (0)