Skip to content

Commit 90acf3c

Browse files
committed
Add config option to save DateTime and TimeOffset as Int64
1 parent c9a06b5 commit 90acf3c

File tree

3 files changed

+62
-5
lines changed

3 files changed

+62
-5
lines changed

Assets/FullSerializer/Source/Converters/fsDateConverter.cs

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,31 +27,45 @@ public override bool CanProcess(Type type) {
2727
public override fsResult TrySerialize(object instance, out fsData serialized, Type storageType) {
2828
if (instance is DateTime) {
2929
var dateTime = (DateTime)instance;
30-
serialized = new fsData(dateTime.ToString(DateTimeFormatString));
30+
if(Serializer.Config.SerializeDateTimeAsInteger) {
31+
serialized = new fsData(dateTime.Ticks);
32+
} else {
33+
serialized = new fsData(dateTime.ToString(DateTimeFormatString));
34+
return fsResult.Success;
35+
}
3136
return fsResult.Success;
3237
}
3338

3439
if (instance is DateTimeOffset) {
3540
var dateTimeOffset = (DateTimeOffset)instance;
36-
serialized = new fsData(dateTimeOffset.ToString(DateTimeOffsetFormatString));
41+
serialized = new fsData(dateTimeOffset.Ticks);
3742
return fsResult.Success;
3843
}
3944

4045
if (instance is TimeSpan) {
4146
var timeSpan = (TimeSpan)instance;
42-
serialized = new fsData(timeSpan.ToString());
47+
if(Serializer.Config.SerializeDateTimeAsInteger) {
48+
serialized = new fsData(timeSpan.Ticks);
49+
} else {
50+
serialized = new fsData(timeSpan.ToString());
51+
}
4352
return fsResult.Success;
4453
}
4554

4655
throw new InvalidOperationException("FullSerializer Internal Error -- Unexpected serialization type");
4756
}
4857

4958
public override fsResult TryDeserialize(fsData data, ref object instance, Type storageType) {
50-
if (data.IsString == false) {
51-
return fsResult.Fail("Date deserialization requires a string, not " + data.Type);
59+
if (data.IsString == false && (data.IsInt64 == false || Serializer.Config.SerializeDateTimeAsInteger == false || instance is DateTimeOffset)) {
60+
return fsResult.Fail("Date deserialization requires a string or int, not " + data.Type);
5261
}
5362

5463
if (storageType == typeof(DateTime)) {
64+
if (Serializer.Config.SerializeDateTimeAsInteger && data.IsInt64) {
65+
instance = new DateTime(data.AsInt64);
66+
return fsResult.Success;
67+
}
68+
5569
DateTime result;
5670
if (DateTime.TryParse(data.AsString, null, DateTimeStyles.RoundtripKind, out result)) {
5771
instance = result;
@@ -84,6 +98,11 @@ public override fsResult TryDeserialize(fsData data, ref object instance, Type s
8498
}
8599

86100
if (storageType == typeof(TimeSpan)) {
101+
if (Serializer.Config.SerializeDateTimeAsInteger && data.IsInt64) {
102+
instance = new TimeSpan(data.AsInt64);
103+
return fsResult.Success;
104+
}
105+
87106
TimeSpan result;
88107
if (TimeSpan.TryParse(data.AsString, out result)) {
89108
instance = result;

Assets/FullSerializer/Source/fsConfig.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,12 @@ public class fsConfig {
9292
/// </summary>
9393
public string CustomDateTimeFormatString = null;
9494

95+
/// <summary>
96+
/// If true, DateTime and TimeSpan will be saved as 64 bit integers
97+
/// rather than strings. DateTimeOffset will still be saved as string.
98+
/// </summary>
99+
public bool SerializeDateTimeAsInteger = false;
100+
95101
/// <summary>
96102
/// Int64 and UInt64 will be serialized and deserialized as string for
97103
/// compatibility

Assets/FullSerializer/Testing/Editor/DateTimeTests.cs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,36 @@ public void StrangeFormatTests() {
1111

1212
Assert.AreEqual(Convert.ToDateTime("2016-01-22T12:06:57.503005Z"), time);
1313
}
14+
15+
[Test]
16+
public void TestDateTimeAsIntIsInt()
17+
{
18+
var serializer = new fsSerializer { Config = { SerializeDateTimeAsInteger = true } };
19+
20+
var original = new DateTime( 1985, 8, 22, 4, 19, 01, 123, DateTimeKind.Utc );
21+
fsData serializedData;
22+
serializer.TrySerialize( original, out serializedData ).AssertSuccessWithoutWarnings();
23+
24+
Assert.That( serializedData.IsInt64 );
25+
}
26+
27+
[Test]
28+
public void TestDateTimeAsIntRoundTrips()
29+
{
30+
var serializer = new fsSerializer { Config = { SerializeDateTimeAsInteger = true } };
31+
32+
var original = new DateTime( 1985, 8, 22, 4, 19, 01, 123, DateTimeKind.Utc );
33+
var deserialized = Clone( original, serializer, serializer );
34+
35+
Assert.AreEqual( original, deserialized );
36+
}
37+
38+
public static T Clone<T>( T original, fsSerializer serializer, fsSerializer deserializer )
39+
{
40+
fsData serializedData;
41+
serializer.TrySerialize( original, out serializedData ).AssertSuccessWithoutWarnings();
42+
var actual = default( T );
43+
deserializer.TryDeserialize( serializedData, ref actual );
44+
return actual;
45+
}
1446
}

0 commit comments

Comments
 (0)