2021-04-29 15:35:57 -04:00
|
|
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
|
|
2022-03-23 14:50:23 -04:00
|
|
|
using System;
|
|
|
|
|
using System.Globalization;
|
2021-04-29 15:10:34 -04:00
|
|
|
using MongoDB.Bson;
|
|
|
|
|
using MongoDB.Bson.Serialization;
|
|
|
|
|
using MongoDB.Bson.Serialization.Serializers;
|
|
|
|
|
|
2023-03-17 09:50:40 -04:00
|
|
|
namespace Horde.Server.Utilities
|
2021-04-29 15:10:34 -04:00
|
|
|
{
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Serializer for DateTimeOffset structs, which writes data as a string
|
|
|
|
|
/// </summary>
|
|
|
|
|
class DateTimeOffsetStringSerializer : StructSerializerBase<DateTimeOffset>
|
|
|
|
|
{
|
|
|
|
|
/// <inheritdoc/>
|
2022-03-23 14:50:23 -04:00
|
|
|
public override DateTimeOffset Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
|
2021-04-29 15:10:34 -04:00
|
|
|
{
|
2022-03-23 14:50:23 -04:00
|
|
|
switch (context.Reader.CurrentBsonType)
|
2021-04-29 15:10:34 -04:00
|
|
|
{
|
|
|
|
|
case BsonType.String:
|
2022-03-23 14:50:23 -04:00
|
|
|
string stringValue = context.Reader.ReadString();
|
|
|
|
|
return DateTimeOffset.Parse(stringValue, DateTimeFormatInfo.InvariantInfo);
|
2021-04-29 15:10:34 -04:00
|
|
|
case BsonType.DateTime:
|
2022-03-23 14:50:23 -04:00
|
|
|
long ticks = context.Reader.ReadDateTime();
|
|
|
|
|
return DateTimeOffset.FromUnixTimeMilliseconds(ticks);
|
2021-04-29 15:10:34 -04:00
|
|
|
default:
|
2022-03-23 14:50:23 -04:00
|
|
|
throw new FormatException($"Unable to deserialize a DateTimeOffset from a {context.Reader.CurrentBsonType}");
|
2021-04-29 15:10:34 -04:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <inheritdoc/>
|
2022-03-23 14:50:23 -04:00
|
|
|
public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, DateTimeOffset value)
|
2021-04-29 15:10:34 -04:00
|
|
|
{
|
2022-03-23 14:50:23 -04:00
|
|
|
context.Writer.WriteString(value.ToString(DateTimeFormatInfo.InvariantInfo));
|
2021-04-29 15:10:34 -04:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|