У меня возникла странная проблема при сериализации большого массива DateTime
(каждая временная метка имеет тип UT C). Я выполнил следующие шаги:
- преобразование каждого
DateTime
в тип long
через DateTime.ToBinary()
- преобразование
long[]
в byte[]
через Buffer.BlockCopy - запись байтового массива в файловый поток
- чтение в байтовом массиве через файловый поток
- преобразование
byte[]
в long[]
через Buffer.BlockCopy - преобразовать каждый
long
обратно в DateTime с помощью DateTime.FromBinary(long)
Проблема заключается в том, что DateTimes не совпадают между исходным массивом и окончательным массивом. Фактически, некоторые из отметок времени отображаются как год 2059 или около того, когда исходный массив строго содержал отметки времени прошлого.
Я запускаю всю процедуру на своем локальном компьютере в Windows 10, поэтому не должно быть проблем с часовым поясом или проблем с порядком байтов. Может кто-нибудь помочь?
Вот так я конвертирую метки времени типа DateTime
в long[]
:
var dataCollection = new DataCollection(header.DataProviderId, DateTimeKind.Utc, header.Symbol, header.QuoteType, header.Compression)
{
TimeStamps = quotes.Select(x => x.TimeStamp.ToBinary()).ToArray(),
Bid = quotes.Select(x => x.Bid).ToArray(),
Ask = quotes.Select(x => x.Ask).ToArray()
};
Вот преобразования между long[]
-> byte[]
и назад:
public static byte[] SerializeBlockCopy<T>(Array sourceArray, long sourceStartIndex, long numberItemsToSerialize)
{
var targetArraySize = numberItemsToSerialize * Marshal.SizeOf(typeof(T));
var targetArray = new byte[targetArraySize];
Buffer.BlockCopy(sourceArray, (int)sourceStartIndex, targetArray, 0, (int)targetArraySize);
return targetArray;
}
public static T[] DeserializeBlockCopy<T>(byte[] sourceArray)
{
var targetArraySize = sourceArray.Length / Marshal.SizeOf(typeof(T));
var targetArray = new T[targetArraySize];
Buffer.BlockCopy(sourceArray, 0, targetArray,0, sourceArray.Length);
return targetArray;
}