diff --git a/Assets/FullSerializer/Source/Converters/fsDateConverter.cs b/Assets/FullSerializer/Source/Converters/fsDateConverter.cs
index ca39993..d62f5c9 100644
--- a/Assets/FullSerializer/Source/Converters/fsDateConverter.cs
+++ b/Assets/FullSerializer/Source/Converters/fsDateConverter.cs
@@ -27,19 +27,28 @@ public override bool CanProcess(Type type) {
public override fsResult TrySerialize(object instance, out fsData serialized, Type storageType) {
if (instance is DateTime) {
var dateTime = (DateTime)instance;
- serialized = new fsData(dateTime.ToString(DateTimeFormatString));
+ if(Serializer.Config.SerializeDateTimeAsInteger) {
+ serialized = new fsData(dateTime.Ticks);
+ } else {
+ serialized = new fsData(dateTime.ToString(DateTimeFormatString));
+ return fsResult.Success;
+ }
return fsResult.Success;
}
if (instance is DateTimeOffset) {
var dateTimeOffset = (DateTimeOffset)instance;
- serialized = new fsData(dateTimeOffset.ToString(DateTimeOffsetFormatString));
+ serialized = new fsData(dateTimeOffset.Ticks);
return fsResult.Success;
}
if (instance is TimeSpan) {
var timeSpan = (TimeSpan)instance;
- serialized = new fsData(timeSpan.ToString());
+ if(Serializer.Config.SerializeDateTimeAsInteger) {
+ serialized = new fsData(timeSpan.Ticks);
+ } else {
+ serialized = new fsData(timeSpan.ToString());
+ }
return fsResult.Success;
}
@@ -47,11 +56,16 @@ public override fsResult TrySerialize(object instance, out fsData serialized, Ty
}
public override fsResult TryDeserialize(fsData data, ref object instance, Type storageType) {
- if (data.IsString == false) {
- return fsResult.Fail("Date deserialization requires a string, not " + data.Type);
+ if (data.IsString == false && (data.IsInt64 == false || Serializer.Config.SerializeDateTimeAsInteger == false || instance is DateTimeOffset)) {
+ return fsResult.Fail("Date deserialization requires a string or int, not " + data.Type);
}
if (storageType == typeof(DateTime)) {
+ if (Serializer.Config.SerializeDateTimeAsInteger && data.IsInt64) {
+ instance = new DateTime(data.AsInt64);
+ return fsResult.Success;
+ }
+
DateTime result;
if (DateTime.TryParse(data.AsString, null, DateTimeStyles.RoundtripKind, out result)) {
instance = result;
@@ -84,6 +98,11 @@ public override fsResult TryDeserialize(fsData data, ref object instance, Type s
}
if (storageType == typeof(TimeSpan)) {
+ if (Serializer.Config.SerializeDateTimeAsInteger && data.IsInt64) {
+ instance = new TimeSpan(data.AsInt64);
+ return fsResult.Success;
+ }
+
TimeSpan result;
if (TimeSpan.TryParse(data.AsString, out result)) {
instance = result;
diff --git a/Assets/FullSerializer/Source/fsConfig.cs b/Assets/FullSerializer/Source/fsConfig.cs
index e3096d5..dcc374d 100644
--- a/Assets/FullSerializer/Source/fsConfig.cs
+++ b/Assets/FullSerializer/Source/fsConfig.cs
@@ -98,6 +98,12 @@ public class fsConfig {
///
public string CustomDateTimeFormatString = null;
+ ///
+ /// If true, DateTime and TimeSpan will be saved as 64 bit integers
+ /// rather than strings. DateTimeOffset will still be saved as string.
+ ///
+ public bool SerializeDateTimeAsInteger = false;
+
///
/// Int64 and UInt64 will be serialized and deserialized as string for
/// compatibility
diff --git a/Assets/FullSerializer/Testing/Editor/DateTimeTests.cs b/Assets/FullSerializer/Testing/Editor/DateTimeTests.cs
index 8c4fc69..5a66c79 100644
--- a/Assets/FullSerializer/Testing/Editor/DateTimeTests.cs
+++ b/Assets/FullSerializer/Testing/Editor/DateTimeTests.cs
@@ -1,14 +1,44 @@
using System;
-using FullSerializer;
using NUnit.Framework;
-public class DateTimeTests {
- [Test]
- public void StrangeFormatTests() {
- var serializer = new fsSerializer();
- DateTime time = DateTime.Now;
- serializer.TryDeserialize(new fsData("2016-01-22T12:06:57.503005Z"), ref time).AssertSuccessWithoutWarnings();
+namespace FullSerializer.Tests {
+ public class DateTimeTests {
+ [Test]
+ public void StrangeFormatTests() {
+ var serializer = new fsSerializer();
+ DateTime time = DateTime.Now;
+ serializer.TryDeserialize(new fsData("2016-01-22T12:06:57.503005Z"), ref time).AssertSuccessWithoutWarnings();
- Assert.AreEqual(Convert.ToDateTime("2016-01-22T12:06:57.503005Z"), time);
+ Assert.AreEqual(Convert.ToDateTime("2016-01-22T12:06:57.503005Z"), time);
+ }
+
+ [Test]
+ public void TestDateTimeAsIntIsInt() {
+ var serializer = new fsSerializer {Config = {SerializeDateTimeAsInteger = true}};
+
+ var original = new DateTime(1985, 8, 22, 4, 19, 01, 123, DateTimeKind.Utc);
+ fsData serializedData;
+ serializer.TrySerialize(original, out serializedData).AssertSuccessWithoutWarnings();
+
+ Assert.That(serializedData.IsInt64);
+ }
+
+ [Test]
+ public void TestDateTimeAsIntRoundTrips() {
+ var serializer = new fsSerializer {Config = {SerializeDateTimeAsInteger = true}};
+
+ var original = new DateTime(1985, 8, 22, 4, 19, 01, 123, DateTimeKind.Utc);
+ var deserialized = Clone(original, serializer, serializer);
+
+ Assert.AreEqual(original, deserialized);
+ }
+
+ public static T Clone(T original, fsSerializer serializer, fsSerializer deserializer) {
+ fsData serializedData;
+ serializer.TrySerialize(original, out serializedData).AssertSuccessWithoutWarnings();
+ var actual = default(T);
+ deserializer.TryDeserialize(serializedData, ref actual);
+ return actual;
+ }
}
-}
\ No newline at end of file
+}