Skip to content

Commit 536311d

Browse files
hymermanBenHymersTwoPoint
authored andcommitted
Add config option to save DateTime and TimeOffset as Int64
1 parent c01db30 commit 536311d

File tree

3 files changed

+69
-14
lines changed

3 files changed

+69
-14
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
@@ -98,6 +98,12 @@ public class fsConfig {
9898
/// </summary>
9999
public string CustomDateTimeFormatString = null;
100100

101+
/// <summary>
102+
/// If true, DateTime and TimeSpan will be saved as 64 bit integers
103+
/// rather than strings. DateTimeOffset will still be saved as string.
104+
/// </summary>
105+
public bool SerializeDateTimeAsInteger = false;
106+
101107
/// <summary>
102108
/// Int64 and UInt64 will be serialized and deserialized as string for
103109
/// compatibility
Lines changed: 39 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,44 @@
11
using System;
2-
using FullSerializer;
32
using NUnit.Framework;
43

5-
public class DateTimeTests {
6-
[Test]
7-
public void StrangeFormatTests() {
8-
var serializer = new fsSerializer();
9-
DateTime time = DateTime.Now;
10-
serializer.TryDeserialize(new fsData("2016-01-22T12:06:57.503005Z"), ref time).AssertSuccessWithoutWarnings();
4+
namespace FullSerializer.Tests {
5+
public class DateTimeTests {
6+
[Test]
7+
public void StrangeFormatTests() {
8+
var serializer = new fsSerializer();
9+
DateTime time = DateTime.Now;
10+
serializer.TryDeserialize(new fsData("2016-01-22T12:06:57.503005Z"), ref time).AssertSuccessWithoutWarnings();
1111

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

0 commit comments

Comments
 (0)