diff --git a/src/Common/CommonStandard/CommonStandard.csproj b/src/Common/CommonStandard/CommonStandard.csproj
index b543dff82..45bae3d0a 100644
--- a/src/Common/CommonStandard/CommonStandard.csproj
+++ b/src/Common/CommonStandard/CommonStandard.csproj
@@ -35,8 +35,8 @@
-
-
+
+
diff --git a/src/Common/CommonStandard/Components/Interfaces/IChromatogramPeakFeature.cs b/src/Common/CommonStandard/Components/Interfaces/IChromatogramPeakFeature.cs
index 6a5cfa8a0..aadb0ad52 100644
--- a/src/Common/CommonStandard/Components/Interfaces/IChromatogramPeakFeature.cs
+++ b/src/Common/CommonStandard/Components/Interfaces/IChromatogramPeakFeature.cs
@@ -4,7 +4,8 @@
using System;
namespace CompMs.Common.Interfaces {
- [Union(0, typeof(BaseChromatogramPeakFeature))]
+ //[Union(0, typeof(BaseChromatogramPeakFeature))]
+ [MessagePackFormatter(typeof(ChromatogramPeakFeatureInterfaceFormatter))]
public interface IChromatogramPeakFeature {
// basic property
@@ -40,37 +41,36 @@ public static bool IsOverlaped(this IChromatogramPeakFeature self, IChromatogram
}
}
- public class ChromatogramPeakFeatureInterfaceFormatter : IMessagePackFormatter
+ public class ChromatogramPeakFeatureInterfaceFormatter : IMessagePackFormatter
{
- public IChromatogramPeakFeature Deserialize(byte[] bytes, int offset, IFormatterResolver formatterResolver, out int readSize) {
- return formatterResolver.GetFormatterWithVerify().Deserialize(bytes, offset, formatterResolver, out readSize);
+ public IChromatogramPeakFeature Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options) {
+ return options.Resolver.GetFormatterWithVerify().Deserialize(ref reader, options);
}
- public int Serialize(ref byte[] bytes, int offset, IChromatogramPeakFeature value, IFormatterResolver formatterResolver) {
+ public void Serialize(ref MessagePackWriter writer, IChromatogramPeakFeature value, MessagePackSerializerOptions options) {
if (value == null) {
- return MessagePackBinary.WriteNil(ref bytes, offset);
+ writer.WriteNil();
+ return;
}
if (value is BaseChromatogramPeakFeature bp) {
- return formatterResolver.GetFormatterWithVerify().Serialize(ref bytes, offset, bp, formatterResolver);
- }
- else {
- var currentOffset = offset;
- currentOffset += MessagePackBinary.WriteArrayHeader(ref bytes, currentOffset, 12);
- currentOffset += MessagePackBinary.WriteInt32(ref bytes, currentOffset, value.ChromScanIdLeft);
- currentOffset += MessagePackBinary.WriteInt32(ref bytes, currentOffset, value.ChromScanIdTop);
- currentOffset += MessagePackBinary.WriteInt32(ref bytes, currentOffset, value.ChromScanIdRight);
- var chromFormatter = formatterResolver.GetFormatterWithVerify();
- currentOffset += chromFormatter.Serialize(ref bytes, currentOffset, value.ChromXsLeft, formatterResolver);
- currentOffset += chromFormatter.Serialize(ref bytes, currentOffset, value.ChromXsTop, formatterResolver);
- currentOffset += chromFormatter.Serialize(ref bytes, currentOffset, value.ChromXsRight, formatterResolver);
- currentOffset += MessagePackBinary.WriteDouble(ref bytes, currentOffset, value.PeakHeightLeft);
- currentOffset += MessagePackBinary.WriteDouble(ref bytes, currentOffset, value.PeakHeightTop);
- currentOffset += MessagePackBinary.WriteDouble(ref bytes, currentOffset, value.PeakHeightRight);
- currentOffset += MessagePackBinary.WriteDouble(ref bytes, currentOffset, value.PeakAreaAboveZero);
- currentOffset += MessagePackBinary.WriteDouble(ref bytes, currentOffset, value.PeakAreaAboveBaseline);
- currentOffset += MessagePackBinary.WriteDouble(ref bytes, currentOffset, value.Mass);
- return currentOffset - offset;
+ options.Resolver.GetFormatterWithVerify().Serialize(ref writer, bp, options);
+ return;
}
+
+ writer.WriteArrayHeader(12);
+ writer.Write(value.ChromScanIdLeft);
+ writer.Write(value.ChromScanIdTop);
+ writer.Write(value.ChromScanIdRight);
+ var chromFormatter = options.Resolver.GetFormatterWithVerify();
+ chromFormatter.Serialize(ref writer, value.ChromXsLeft, options);
+ chromFormatter.Serialize(ref writer, value.ChromXsTop, options);
+ chromFormatter.Serialize(ref writer, value.ChromXsRight, options);
+ writer.Write(value.PeakHeightLeft);
+ writer.Write(value.PeakHeightTop);
+ writer.Write(value.PeakHeightRight);
+ writer.Write(value.PeakAreaAboveZero);
+ writer.Write(value.PeakAreaAboveBaseline);
+ writer.Write(value.Mass);
}
}
}
diff --git a/src/Common/CommonStandard/Components/Interfaces/IMoleculeProperty.cs b/src/Common/CommonStandard/Components/Interfaces/IMoleculeProperty.cs
index 87daeb677..b921cfa78 100644
--- a/src/Common/CommonStandard/Components/Interfaces/IMoleculeProperty.cs
+++ b/src/Common/CommonStandard/Components/Interfaces/IMoleculeProperty.cs
@@ -42,35 +42,36 @@ public static IMoleculeProperty AsPutative(this IMoleculeProperty molecule) {
public static readonly IMessagePackFormatter Formatter = new MoleculePropertyFormatter();
- class MoleculePropertyFormatter : IMessagePackFormatter
+ internal class MoleculePropertyFormatter : IMessagePackFormatter
{
- public IMoleculeProperty Deserialize(byte[] bytes, int offset, IFormatterResolver formatterResolver, out int readSize) {
- var currentOffset = offset;
- var contentSize = MessagePackBinary.ReadArrayHeader(bytes, currentOffset, out var readTmp);
- currentOffset += readTmp;
- var name = MessagePackBinary.ReadString(bytes, currentOffset, out readTmp);
- currentOffset += readTmp;
- var formula = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, currentOffset, formatterResolver, out readTmp);
- currentOffset += readTmp;
- var ontology = MessagePackBinary.ReadString(bytes, currentOffset, out readTmp);
- currentOffset += readTmp;
- var smiles = MessagePackBinary.ReadString(bytes, currentOffset, out readTmp);
- currentOffset += readTmp;
- var inchikey = MessagePackBinary.ReadString(bytes, currentOffset, out readTmp);
- currentOffset += readTmp;
- readSize = currentOffset - offset;
+ public IMoleculeProperty? Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options) {
+ if (reader.TryReadNil()) {
+ return null;
+ }
+ var count = reader.ReadArrayHeader();
+ if (count != 5) {
+ throw new MessagePackSerializationException($"Unexpected array length for {nameof(IMoleculeProperty)}: {count}.");
+ }
+ var name = reader.ReadString();
+ var formula = options.Resolver.GetFormatterWithVerify().Deserialize(ref reader, options);
+ var ontology = reader.ReadString();
+ var smiles = reader.ReadString();
+ var inchikey = reader.ReadString();
return new MoleculeProperty(name, formula, ontology, smiles, inchikey);
}
- public int Serialize(ref byte[] bytes, int offset, IMoleculeProperty value, IFormatterResolver formatterResolver) {
- var currentOffset = offset;
- currentOffset += MessagePackBinary.WriteArrayHeader(ref bytes, currentOffset, 5);
- currentOffset += MessagePackBinary.WriteString(ref bytes, currentOffset, value?.Name);
- currentOffset += formatterResolver.GetFormatterWithVerify().Serialize(ref bytes, currentOffset, value?.Formula, formatterResolver);
- currentOffset += MessagePackBinary.WriteString(ref bytes, currentOffset, value?.Ontology);
- currentOffset += MessagePackBinary.WriteString(ref bytes, currentOffset, value?.SMILES);
- currentOffset += MessagePackBinary.WriteString(ref bytes, currentOffset, value?.InChIKey);
- return currentOffset - offset;
+ public void Serialize(ref MessagePackWriter writer, IMoleculeProperty value, MessagePackSerializerOptions options) {
+ if (value is null)
+ {
+ writer.WriteNil();
+ return;
+ }
+ writer.WriteArrayHeader(5);
+ writer.Write(value?.Name);
+ options.Resolver.GetFormatterWithVerify().Serialize(ref writer, value?.Formula, options);
+ writer.Write(value?.Ontology);
+ writer.Write(value?.SMILES);
+ writer.Write(value?.InChIKey);
}
}
}
diff --git a/src/Common/CommonStandard/DataObj/Property/AdductIon.cs b/src/Common/CommonStandard/DataObj/Property/AdductIon.cs
index cdd770aa5..99e853ad1 100644
--- a/src/Common/CommonStandard/DataObj/Property/AdductIon.cs
+++ b/src/Common/CommonStandard/DataObj/Property/AdductIon.cs
@@ -2,7 +2,6 @@
using CompMs.Common.Parser;
using MessagePack;
using MessagePack.Formatters;
-using MessagePack.Resolvers;
using System;
using System.Collections.Concurrent;
@@ -167,37 +166,54 @@ public AdductIon GetOrAdd(string adduct) {
}
}
- class AdductIonFormatter : IMessagePackFormatter
+ internal class AdductIonFormatter : IMessagePackFormatter
{
- AdductIon IMessagePackFormatter.Deserialize(byte[] bytes, int offset, IFormatterResolver formatterResolver, out int readSize) {
- readSize = MessagePackBinary.ReadNextBlock(bytes, offset);
- if (MessagePackBinary.IsNil(bytes, offset)) {
+ public AdductIon Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options) {
+ if (reader.TryReadNil()) {
return Default;
}
- var count = MessagePackBinary.ReadArrayHeader(bytes, offset, out var tmp);
+ var count = reader.ReadArrayHeader();
if (count < 3) {
+ for (int i = 0; i < count; i++) {
+ reader.Skip();
+ }
return Default;
}
- tmp += MessagePackBinary.ReadNext(bytes, offset + tmp);
- tmp += MessagePackBinary.ReadNext(bytes, offset + tmp);
- var name = MessagePackBinary.ReadString(bytes, offset + tmp, out var read);
- tmp += read;
+ reader.Skip();
+ reader.Skip();
+ var name = reader.ReadString();
var adduct = GetAdductIon(name);
- tmp += MessagePackBinary.ReadNext(bytes, offset + tmp);
- tmp += MessagePackBinary.ReadNext(bytes, offset + tmp);
- tmp += MessagePackBinary.ReadNext(bytes, offset + tmp);
- adduct.M1Intensity = MessagePackBinary.ReadDouble(bytes, offset + tmp, out read);
- tmp += read;
- adduct.M2Intensity = MessagePackBinary.ReadDouble(bytes, offset + tmp, out read);
- tmp += read;
- tmp += MessagePackBinary.ReadNext(bytes, offset + tmp);
- adduct.IsIncluded |= MessagePackBinary.ReadBoolean(bytes, offset + tmp, out _);
+ reader.Skip();
+ reader.Skip();
+ reader.Skip();
+ adduct.M1Intensity = reader.ReadDouble();
+ adduct.M2Intensity = reader.ReadDouble();
+ reader.Skip();
+ adduct.IsIncluded |= reader.ReadBoolean();
return adduct;
}
- int IMessagePackFormatter.Serialize(ref byte[] bytes, int offset, AdductIon value, IFormatterResolver formatterResolver) {
- var formatter = DynamicObjectResolver.Instance.GetFormatterWithVerify();
- return formatter.Serialize(ref bytes, offset, value, formatterResolver);
+ public void Serialize(ref MessagePackWriter writer, AdductIon value, MessagePackSerializerOptions options) {
+ //var formatter = DynamicObjectResolver.Instance.GetFormatterWithVerify();
+ //formatter.Serialize(ref writer, value, options);
+ if (value is null)
+ {
+ writer.WriteNil();
+ return;
+ }
+
+ writer.WriteArrayHeader(10);
+
+ writer.Write(value.AdductIonAccurateMass); // Key 0
+ writer.Write(value.AdductIonXmer); // Key 1
+ writer.Write(value.AdductIonName); // Key 2
+ writer.Write(value.ChargeNumber); // Key 3
+ writer.Write((int)value.IonMode); // Key 4
+ writer.Write(value.FormatCheck); // Key 5
+ writer.Write(value.M1Intensity); // Key 6
+ writer.Write(value.M2Intensity); // Key 7
+ writer.Write(value.IsRadical); // Key 8
+ writer.Write(value.IsIncluded); // Key 9
}
}
}
diff --git a/src/Common/CommonStandard/MessagePack/LargeListMessagePack.cs b/src/Common/CommonStandard/MessagePack/LargeListMessagePack.cs
index 996f5cba2..2e28c8760 100644
--- a/src/Common/CommonStandard/MessagePack/LargeListMessagePack.cs
+++ b/src/Common/CommonStandard/MessagePack/LargeListMessagePack.cs
@@ -1,327 +1,198 @@
-using MessagePack;
-using MessagePack.LZ4;
+using MessagePack;
+using MessagePack.Formatters;
using MessagePack.Resolvers;
using System;
using System.Collections.Generic;
using System.IO;
+using System.Linq;
namespace CompMs.Common.MessagePack {
- public static class LargeListMessagePack
- {
- public static int OffsetCutoff = 1073741824;
+ public static class LargeListMessagePack {
public const sbyte ExtensionTypeCode = 99;
- public const int NotCompressionSize = 64;
- public const int HeaderSize = 11;
- private static byte[] GetBuffer()
- {
- return new byte[65536];
- //if (buffer is null)
- //{
- // buffer = new byte[65536];
- //}
- //return buffer;
- }
+ public static void Serialize(Stream stream, IReadOnlyList value) {
+ if (value is null) {
+ MessagePackSerializer.Serialize(stream, value, MessagePackSerializerOptions.Standard.WithResolver(StandardResolver.Instance).WithCompression(MessagePackCompression.Lz4BlockArray));
+ return;
+ }
- private static byte[] GetBufferLZ4()
- {
- return new byte[65536];
- //if (bufferLz is null)
- //{
- // bufferLz = new byte[65536];
- //}
- //return bufferLz;
+ var options = MessagePackSerializerOptions.Standard.WithResolver(StandardResolver.Instance).WithCompression(MessagePackCompression.Lz4BlockArray);
+ Memory memory = (value as T[]) ?? value.ToArray();
+ var length = memory.Length;
+ var size = (int)Math.Sqrt(length) + 1;
+ var iteration = (length + size - 1) / size;
+ for (int i = 0; i < iteration; i++) {
+ MessagePackSerializer.Serialize(stream, new SerializingDataContainer { Data = memory.Slice(i * size, Math.Min(size, length - i * size)) }, options);
+ }
}
- public static IFormatterResolver DefaultResolver {
- get {
- return StandardResolver.Instance;
- }
+ public static List Deserialize(Stream stream) {
+ return DeserializeCore(stream, MessagePackSerializerOptions.Standard);
}
- public static void Serialize(Stream stream, IReadOnlyList value, IFormatterResolver resolver = null)
- {
- if (resolver == null) resolver = DefaultResolver;
- var bytes = GetBuffer();
- var offset = 0;
- if (value == null)
- {
- offset += MessagePackBinary.WriteNil(ref bytes, offset);
- stream.Write(bytes, 0, offset);
- }
- else
- {
- var formatter = resolver.GetFormatterWithVerify();
- var startOffSet = offset;
- var c = value.Count;
- offset = 5;
- var lastCounter = -1;
- var bufferLz4 = GetBufferLZ4();
- for (int i = 0; i < c; i++)
- {
- offset += formatter.Serialize(ref bytes, offset, value[i], resolver);
- if (offset > OffsetCutoff)
- {
- MessagePackBinary.WriteArrayHeader(ref bytes, startOffSet, i - lastCounter);
- lastCounter = i;
- bufferLz4 = ToLZ4Binary(new ArraySegment(bytes, 0, offset));
- stream.Write(bufferLz4, 0, bufferLz4.Length);
- offset = 5; // size of MessagePackBinary.WriteArrayHeader
- bytes = GetBuffer();
- }
- }
- if (lastCounter < c - 1)
- {
- MessagePackBinary.WriteArrayHeader(ref bytes, startOffSet, c - lastCounter - 1);
- bufferLz4 = ToLZ4Binary(new ArraySegment(bytes, 0, offset));
- stream.Write(bufferLz4, startOffSet, bufferLz4.Length);
- }
+ public static IEnumerable> DeserializeIncremental(Stream stream) {
+ foreach (var result in DeserializeIncrementalCore(stream, MessagePackSerializerOptions.Standard)) {
+ yield return result;
}
}
- public static byte[] ToLZ4Binary(ArraySegment messagePackBinary)
- {
- var buffer = ToLZ4BinaryCore(messagePackBinary);
- return MessagePackBinary.FastCloneWithResize(buffer.Array, buffer.Count);
+ public static T DeserializeAt(Stream stream, int index) {
+ return DeserializeAt(stream, MessagePackSerializerOptions.Standard, index);
}
-
- static ArraySegment ToLZ4BinaryCore(ArraySegment serializedData)
- {
- //if (serializedData.Count < NotCompressionSize)
- //{
- // // This data couldn't decode.
- // return serializedData;
- //}
- //else
- //{
- var offset = 0;
- var buffer = GetBufferLZ4();
- var maxOutCount = LZ4Codec.MaximumOutputLength(serializedData.Count);
- if (buffer.Length < 6 + 5 + maxOutCount) // (ext header size + fixed length size)
- {
- buffer = new byte[6 + 5 + maxOutCount];
+ public static T DeserializeAt(Stream stream, MessagePackSerializerOptions options, int index) {
+ while (index >= 0) {
+ var success = TryDeserializeAtOrSkip(stream, options, index, out var result, out int skipArraySize);
+ if (success) {
+ return result;
}
+ else if (skipArraySize == 0) {
+ break;
+ }
+ index -= skipArraySize;
+ }
- // acquire ext header position
- var extHeaderOffset = offset;
- offset += (6 + 5);
-
- // write body
- var lz4Length = LZ4Codec.Encode(serializedData.Array, serializedData.Offset, serializedData.Count, buffer, offset, buffer.Length - offset);
- // Console.WriteLine("lz4Length" + lz4Length);
- // write extension header(always 6 bytes)
- extHeaderOffset += MessagePackBinary.WriteExtensionFormatHeaderForceExt32Block(ref buffer, extHeaderOffset, (sbyte)ExtensionTypeCode, lz4Length + 5);
-
- // write length(always 5 bytes)
- MessagePackBinary.WriteInt32ForceInt32Block(ref buffer, extHeaderOffset, serializedData.Count);
-
- return new ArraySegment(buffer, 0, 6 + 5 + lz4Length);
- //}
- }
-
- public static List Deserialize(Stream stream, IFormatterResolver resolver = null)
- {
- return DeserializeCore(stream, resolver);
- }
-
- public static IEnumerable> DeserializeIncremental(Stream stream, IFormatterResolver resolver = null) {
- return DeserializeIncrementalCore(stream, resolver);
+ return default;
}
- static bool FillFromStream(Stream input, ref byte[] buffer, int offset, int readSize)
- {
- int length = 0;
- int read;
- if ((read = input.Read(buffer, offset, readSize)) > 0)
- {
- length += read;
- // Console.WriteLine("read length: " + length);
- if (length == buffer.Length)
- {
- MessagePackBinary.FastResize(ref buffer, length * 2);
+ private static List DeserializeCore(Stream stream, MessagePackSerializerOptions options) {
+ var res = new List();
+ while (true) {
+ var tmp = DeserializeEach(stream, options);
+ if (tmp is null) {
+ break;
}
- return true;
+ res.AddRange(tmp);
}
- return false;
+ return res;
}
-
- static List DeserializeCore(Stream stream, IFormatterResolver resolver)
- {
- var buffer = GetBuffer();
- var res = new List();
- // HeaderSize: extension header(always 6 bytes) + length(always 5 bytes) = 11
- while (FillFromStream(stream, ref buffer, 0, HeaderSize))
- {
- var tmp = DeserializeEach(stream, buffer, resolver);
- if (tmp != null && tmp.Count > 0)
- {
- AddList(res, tmp);
+ private static IEnumerable> DeserializeIncrementalCore(Stream stream, MessagePackSerializerOptions options) {
+ while (true) {
+ var data = DeserializeEach(stream, options);
+ if (data is null) {
+ yield break;
}
+ yield return data;
}
- return res;
}
- private static IEnumerable> DeserializeIncrementalCore(Stream stream, IFormatterResolver resolver) {
- var buffer = GetBuffer();
- // HeaderSize: extension header(always 6 bytes) + length(always 5 bytes) = 11
- while (FillFromStream(stream, ref buffer, 0, HeaderSize))
- {
- yield return DeserializeEach(stream, buffer, resolver);
+ private static List? DeserializeEach(Stream stream, MessagePackSerializerOptions options) {
+ var resolver = CompositeResolver.Create(
+ [new DeserializedDataContainer.DeserializedDataContainerFormatter(),],
+ [StandardResolver.Instance]);
+ try {
+ return MessagePackSerializer.Deserialize>(stream, options.WithResolver(resolver).WithCompression(MessagePackCompression.Lz4BlockArray))?.Data;
+ }
+ catch (MessagePackSerializationException) {
+ return default;
}
}
- static void AddList(List original, List tmp)
- {
- foreach (var t in tmp)
- {
- original.Add(t);
+ private static bool TryDeserializeAtOrSkip(Stream stream, MessagePackSerializerOptions options, int index, out T? result, out int skipArraySize) {
+ var resolver = CompositeResolver.Create(
+ [DeserializedDataContainer.CreateFormatter(index),],
+ [StandardResolver.Instance]);
+ var newOptions = options.WithCompression(MessagePackCompression.Lz4BlockArray).WithResolver(resolver);
+ try {
+ var deserialized = MessagePackSerializer.Deserialize>(stream, newOptions);
+ result = deserialized.Data is null ? default : deserialized.Data.FirstOrDefault();
+ skipArraySize = deserialized.Length;
+ return result != null;
+ }
+ catch (MessagePackSerializationException) {
+ result = default;
+ skipArraySize = 0;
+ return false;
}
}
- static List DeserializeEach(Stream stream, byte[] buffer, IFormatterResolver resolver)
- {
- var bytes = new ArraySegment(buffer, 0, HeaderSize);
- int readSize;
- // Console.WriteLine("MessagePackType: " + MessagePackBinary.GetMessagePackType(bytes.Array, bytes.Offset));
- if (MessagePackBinary.GetMessagePackType(bytes.Array, bytes.Offset) == MessagePackType.Extension)
- {
- var header = MessagePackBinary.ReadExtensionFormatHeader(bytes.Array, bytes.Offset, out readSize);
- if (header.TypeCode == ExtensionTypeCode)
- {
- // decode lz4
- var offset = bytes.Offset + readSize;
- var length = MessagePackBinary.ReadInt32(bytes.Array, offset, out readSize);
- offset += readSize;
- int bufferLength = (int)header.Length - 5;
- buffer = GetBuffer(); // use LZ4 Pool
+ [MessagePackFormatter(typeof(DataContainerFormatter<>))]
+ internal sealed class SerializingDataContainer {
+ public sbyte VersionCode { get; } = 2;
+ public Memory Data { get; set; }
+ }
- if (buffer.Length < bufferLength)
- {
- buffer = new byte[bufferLength];
- }
+ internal class DataContainerFormatter : IMessagePackFormatter?> {
+ public SerializingDataContainer Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options) {
+ throw new NotSupportedException();
+ }
- if (FillFromStream(stream, ref buffer, 0, bufferLength))
- {
- bytes = new ArraySegment(buffer, 0, bufferLength);
- offset = 0;
- // LZ4 Decode
- var len = bytes.Count;
- var bufferLz4 = new byte[length];
- LZ4Codec.Decode(bytes.Array, bytes.Offset, len, bufferLz4, 0, length);
- return DeserializeList(bufferLz4, offset, resolver, out readSize);
- }
+ public void Serialize(ref MessagePackWriter writer, SerializingDataContainer value, MessagePackSerializerOptions options) {
+ writer.WriteInt8(value.VersionCode);
+ writer.WriteArrayHeader(value.Data.Length);
+ for (int i = 0; i < value.Data.Length; i++) {
+ MessagePackSerializer.Serialize(ref writer, value.Data.Span[i], options);
}
}
- // Console.WriteLine("Not working well");
- return new List();
}
- static List DeserializeList(byte[] bytes, int offset, IFormatterResolver formatterResolver, out int readSize)
- {
- if (formatterResolver == null) formatterResolver = DefaultResolver;
- if (MessagePackBinary.IsNil(bytes, offset))
- {
- readSize = 1;
- return null;
- }
- else
- {
- var startOffset = 0;
- var formatter = formatterResolver.GetFormatterWithVerify();
- var len = MessagePackBinary.ReadArrayHeader(bytes, offset, out readSize);
- offset = 5;
- var list = new List(len);
- for (int i = 0; i < len; i++)
- {
- list.Add(formatter.Deserialize(bytes, offset, formatterResolver, out readSize));
- offset += readSize;
+
+ private sealed class DeserializedDataContainer {
+ public List Data { get; set; }
+ public int Length { get; set; }
+
+ public static IMessagePackFormatter> CreateFormatter(int index) => new SpecificDataFormatter(index);
+
+#pragma warning disable MsgPack009, MsgPack010
+ internal class DeserializedDataContainerFormatter : IMessagePackFormatter?> {
+ public DeserializedDataContainer Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options) {
+ int length;
+ if (reader.NextCode == MessagePackCode.Int8) {
+ _ = reader.ReadSByte();
+ length = reader.ReadArrayHeader();
+ }
+ else {
+ var reader_ = reader.CreatePeekReader();
+ length = reader_.ReadArrayHeader();
+ reader.ReadRaw(5);
+ }
+ var data = new List(length);
+ for (int i = 0; i < length; i++) {
+ data.Add(MessagePackSerializer.Deserialize(ref reader, options));
+ }
+ return new DeserializedDataContainer { Length = length, Data = data };
}
- readSize = offset - startOffset;
- return list;
- }
- }
- public static T DeserializeAt(Stream stream, int index, IFormatterResolver resolver = null)
- {
- var buffer = GetBuffer();
- // HeaderSize: extension header(always 6 bytes) + length(always 5 bytes) = 11
- while (FillFromStream(stream, ref buffer, 0, HeaderSize))
- {
- var success = TryDeserializeAtOrSkip(stream, buffer, resolver, index, out var result, out int skipArraySize);
- if (success) {
- return result;
+ public void Serialize(ref MessagePackWriter writer, DeserializedDataContainer value, MessagePackSerializerOptions options) {
+ throw new NotSupportedException();
}
- index -= skipArraySize;
}
- return default;
- }
- static bool TryDeserializeAtOrSkip(Stream stream, byte[] buffer, IFormatterResolver resolver, int index, out T result, out int skipArraySize)
- {
- var bytes = new ArraySegment(buffer, 0, HeaderSize);
- if (MessagePackBinary.GetMessagePackType(bytes.Array, bytes.Offset) == MessagePackType.Extension)
- {
- var header = MessagePackBinary.ReadExtensionFormatHeader(bytes.Array, bytes.Offset, out int readSize);
- if (header.TypeCode == ExtensionTypeCode)
- {
- // decode lz4
- var offset = bytes.Offset + readSize;
- var length = MessagePackBinary.ReadInt32(bytes.Array, offset, out readSize);
- offset += readSize;
- int bufferLength = (int)header.Length - 5;
- buffer = GetBuffer(); // use LZ4 Pool
+ internal class SpecificDataFormatter : IMessagePackFormatter?> {
+ private readonly int _index;
- if (buffer.Length < bufferLength)
- {
- buffer = new byte[bufferLength];
- }
+ public SpecificDataFormatter(int index) {
+ _index = index;
+ }
- if (FillFromStream(stream, ref buffer, 0, bufferLength))
- {
- bytes = new ArraySegment(buffer, 0, bufferLength);
- offset = 0;
- // LZ4 Decode
- var len = bytes.Count;
- var bufferLz4 = new byte[length];
- LZ4Codec.Decode(bytes.Array, bytes.Offset, len, bufferLz4, 0, length);
- var success = TryDeserializeAt(bufferLz4, offset, resolver, index, out result, out skipArraySize);
- if (success) {
- return true;
+ public DeserializedDataContainer Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options) {
+ int length;
+ if (reader.NextCode == MessagePackCode.Int8) {
+ _ = reader.ReadSByte();
+ length = reader.ReadArrayHeader();
+ }
+ else {
+ var reader_ = reader.CreatePeekReader();
+ length = reader_.ReadArrayHeader();
+ reader.ReadRaw(5);
+ }
+ if (length <= _index) {
+ for (int i = 0; i < length; i++) {
+ reader.Skip();
}
+ return new DeserializedDataContainer { Length = length, };
+ }
+ for (int i = 0; i < _index; i++) {
+ reader.Skip();
}
+ return new DeserializedDataContainer { Data = new List { MessagePackSerializer.Deserialize(ref reader, options) }, Length = length };
}
- }
- result = default;
- skipArraySize = 0;
- return false;
- }
- private static bool TryDeserializeAt(byte[] bytes, int offset, IFormatterResolver formatterResolver, int index, out T result, out int skipArraySize) {
- if (formatterResolver == null) formatterResolver = DefaultResolver;
- if (MessagePackBinary.IsNil(bytes, offset))
- {
- skipArraySize = 1;
- result = default;
- return index == 0;
- }
- else
- {
- var formatter = formatterResolver.GetFormatterWithVerify();
- var len = MessagePackBinary.ReadArrayHeader(bytes, offset, out var readSize);
- skipArraySize = len;
- offset += 5;
- if (len > index) {
- for (int i = 0; i < index; i++)
- {
- offset += MessagePackBinary.ReadNextBlock(bytes, offset);
- }
- result = formatter.Deserialize(bytes, offset, formatterResolver, out int tmpReadSize);
- return true;
+ public void Serialize(ref MessagePackWriter writer, DeserializedDataContainer value, MessagePackSerializerOptions options) {
+ throw new NotSupportedException();
}
- result = default;
- return false;
}
+#pragma warning restore MsgPack009, MsgPack010
}
}
}
diff --git a/src/Common/CommonStandard/MessagePack/MessagePackHandler.cs b/src/Common/CommonStandard/MessagePack/MessagePackHandler.cs
index f88ce740b..eaaff0e2f 100644
--- a/src/Common/CommonStandard/MessagePack/MessagePackHandler.cs
+++ b/src/Common/CommonStandard/MessagePack/MessagePackHandler.cs
@@ -1,4 +1,5 @@
using MessagePack;
+using MessagePack.Resolvers;
using Rfx.Riken.OsakaUniv;
using System;
using System.Collections.Generic;
@@ -15,7 +16,7 @@ public static T LoadFromFile(string path) {
return res;
}
public static T LoadFromStream(Stream s) {
- return LZ4MessagePackSerializer.Deserialize(s);
+ return MessagePackSerializer.Deserialize(s, MessagePackSerializerOptions.Standard.WithCompression(MessagePackCompression.Lz4BlockArray).WithResolver(StandardResolver.Instance));
}
public static void SaveToFile(T obj, string path) {
@@ -24,7 +25,7 @@ public static void SaveToFile(T obj, string path) {
}
}
public static void SaveToStream(T obj, Stream s) {
- LZ4MessagePackSerializer.Serialize(s, obj);
+ MessagePackSerializer.Serialize(s, obj, MessagePackSerializerOptions.Standard.WithCompression(MessagePackCompression.Lz4BlockArray).WithResolver(StandardResolver.Instance));
}
// large list
diff --git a/src/Common/CommonStandard/Paramerter/AnalysisParamOfMsdialGcms.cs b/src/Common/CommonStandard/Paramerter/AnalysisParamOfMsdialGcms.cs
index 07fc8208f..59eb0bdce 100644
--- a/src/Common/CommonStandard/Paramerter/AnalysisParamOfMsdialGcms.cs
+++ b/src/Common/CommonStandard/Paramerter/AnalysisParamOfMsdialGcms.cs
@@ -45,304 +45,201 @@ public Dictionary RiDictionary
[MessagePackObject]
public class AnalysisParamOfMsdialGcms
{
- [Key(102)]
private string msdialVersionNumber;
- [Key(103)]
private ProcessOption processOption;
- [Key(104)]
[DataMember]
private DataType dataType;
- [Key(105)]
[DataMember]
private IonMode ionMode;
- [Key(106)]
[DataMember]
private AccuracyType accuracyType;
- [Key(107)]
[DataMember]
private float retentionTimeBegin;
- [Key(108)]
[DataMember]
private float retentionTimeEnd;
- [Key(109)]
[DataMember]
private float massRangeBegin;
- [Key(110)]
[DataMember]
private float massRangeEnd;
- [Key(111)]
[DataMember]
private int numThreads;
- [Key(112)]
[DataMember]
private float massAccuracy;
- [Key(113)]
[DataMember]
private SmoothingMethod smoothingMethod;
- [Key(114)]
[DataMember]
private int smoothingLevel;
- [Key(115)]
[DataMember]
private double amplitudeNoiseFactor;
- [Key(116)]
[DataMember]
private double slopeNoiseFactor;
- [Key(117)]
[DataMember]
private double peaktopNoiseFactor;
- [Key(118)]
[DataMember]
private double minimumDatapoints;
- [Key(119)]
[DataMember]
private double minimumAmplitude;
- [Key(120)]
[DataMember]
private int averagePeakWidth;
- [Key(121)]
[DataMember]
private float massSliceWidth;
- [Key(122)]
[DataMember]
private bool backgroundSubtraction;
- [Key(123)]
private List excludedMassList;
- [Key(124)]
[DataMember]
private float amplitudeCutoff;
- [Key(125)]
[DataMember]
private float sigmaWindowValue;
- [Key(126)]
[DataMember]
private bool isReplaceQuantmassByUserDefinedValue;
- [Key(127)]
[DataMember]
private string mspFilePath;
- [Key(128)]
[DataMember]
private string riDictionaryFilePath;
- [Key(129)]
[DataMember]
private RetentionType retentionType;
- [Key(130)]
[DataMember]
private RiCompoundType riCompoundType;
- [Key(131)]
[DataMember]
private Dictionary riDictionary;
- [Key(132)]
[DataMember]
private Dictionary fileIdRiInfoDictionary;
- [Key(133)]
[DataMember]
private float retentionTimeLibrarySearchTolerance;
- [Key(134)]
[DataMember]
private float retentionIndexLibrarySearchTolerance;
- [Key(135)]
[DataMember]
private float eiSimilarityLibrarySearchCutOff;
- [Key(136)]
[DataMember]
private float identificationScoreCutOff;
- [Key(137)]
[DataMember]
private float mzLibrarySearchTolerance;
- [Key(138)]
[DataMember]
private int maxMspDisplayNumber;
- [Key(139)]
[DataMember]
private bool isIdentificationOnlyPerformedForAlignmentFile;
- [Key(140)]
[DataMember]
private bool isUseRetentionInfoForIdentificationScoring;
- [Key(141)]
private bool isUseRetentionInfoForIdentificationFiltering;
- [Key(142)]
private bool isOnlyTopHitReport;
- [Key(143)]
[DataMember]
private AlignmentIndexType alignmentIndexType;
- [Key(144)]
[DataMember]
private int alignmentReferenceFileID;
- [Key(145)]
[DataMember]
private float retentionTimeAlignmentFactor;
- [Key(146)]
[DataMember]
private float retentionTimeAlignmentTolerance;
- [Key(147)]
[DataMember]
private float eiSimilarityAlignmentCutOff;
- [Key(148)]
[DataMember]
private float eiSimilarityAlignmentFactor;
- [Key(149)]
[DataMember]
private float retentionIndexAlignmentTolerance;
- [Key(150)]
[DataMember]
private float alignmentScoreCutOff;
- [Key(151)]
[DataMember]
private bool togetherWithAlignment;
- [Key(152)]
[DataMember]
private bool isForceInsertForGapFilling;
- [Key(153)]
private bool isRepresentativeQuantMassBasedOnBasePeakMz;
- [Key(154)]
[DataMember]
private float peakCountFilter;
- [Key(155)]
[DataMember]
private bool qcAtLeastFilter;
- [Key(156)]
[DataMember]
private bool gapFillingOption;
- [Key(157)]
[DataMember]
private bool isRemoveFeatureBasedOnPeakHeightFoldChange;
- [Key(158)]
[DataMember]
private float sampleMaxOverBlankAverage;
- [Key(159)]
[DataMember]
private float sampleAverageOverBlankAverage;
- [Key(160)]
[DataMember]
private float foldChangeForBlankFiltering;
- [Key(161)]
[DataMember]
private bool isKeepRemovableFeaturesAndAssignedTagForChecking;
- [Key(162)]
[DataMember]
private bool isKeepIdentifiedMetaboliteFeatures;
- [Key(163)]
[DataMember]
private bool isReplaceTrueZeroValuesWithHalfOfMinimumPeakHeightOverAllSamples;
- [Key(164)]
[DataMember]
private bool isKeepAnnotatedMetaboliteFeatures;
- [Key(165)]
[DataMember]
private BlankFiltering blankFiltering;
- [Key(166)]
private float nPercentDetectedInOneGroup;
- [Key(167)]
[DataMember]
private bool isNormalizeNone;
- [Key(168)]
[DataMember]
private bool isNormalizeIS;
- [Key(169)]
[DataMember]
private bool isNormalizeLowess;
- [Key(170)]
[DataMember]
private bool isNormalizeIsLowess;
- [Key(171)]
[DataMember]
private bool isNormalizeTic;
- [Key(172)]
[DataMember]
private bool isNormalizeMTic;
- [Key(173)]
[DataMember]
private bool isBlankSubtract;
- [Key(174)]
private bool isNormalizeSplash;
- [Key(175)]
[DataMember]
private double lowessSpan;
- [Key(176)]
private List standardCompounds;
- [Key(177)]
[DataMember]
private TransformMethod transform;
- [Key(178)]
[DataMember]
private ScaleMethod scale;
- [Key(179)]
[DataMember]
private int maxComponent;
- [Key(180)]
[DataMember]
private TransformMethod transformPls;
- [Key(181)]
[DataMember]
private ScaleMethod scalePls;
- [Key(182)]
[DataMember]
private bool isAutoFitPls;
- [Key(183)]
[DataMember]
private int componentPls;
- [Key(184)]
[DataMember]
private MultivariateAnalysisOption multivariateAnalysisOption;
- [Key(185)]
[DataMember]
private bool isIdentifiedImportedInStatistics;
- [Key(186)]
[DataMember]
private bool isAnnotatedImportedInStatistics;
- [Key(187)]
[DataMember]
private bool isUnknownImportedInStatistics;
- [Key(188)]
[DataMember]
private float mpMs1Tolerance;
- [Key(189)]
[DataMember]
private float mpMs2Tolerance;
- [Key(190)]
[DataMember]
private float mpRtTolerance;
- [Key(191)]
[DataMember]
private int mpTopN;
- [Key(192)]
[DataMember]
private bool mpIsIncludeMsLevel1;
- [Key(193)]
[DataMember]
private bool mpIsUseMs1LevelForQuant;
- [Key(194)]
[DataMember]
private bool mpIsFocusedSpotOutput;
- [Key(195)]
[DataMember]
private bool mpIsReferenceBaseOutput;
- [Key(196)]
[DataMember]
private bool mpIsExportOtherCandidates;
- [Key(197)]
[DataMember]
private float mpIdentificationScoreCutOff;
- [Key(198)]
[DataMember]
private List eicDisplayQueries;
- [Key(199)]
[DataMember]
private bool mnIsExportIonCorrelation;
- [Key(200)]
[DataMember]
private double mnMassTolerance;
- [Key(201)]
[DataMember]
private double mnRelativeAbundanceCutOff;
- [Key(202)]
[DataMember]
private double mnSpectrumSimilarityCutOff;
- [Key(203)]
[DataMember]
private double mnIonCorrelationSimilarityCutOff;
- [Key(204)]
[DataMember]
private double mnRtTolerance;
diff --git a/src/MSDIAL4/DatabaseStandard/DatabaseStandard.csproj b/src/MSDIAL4/DatabaseStandard/DatabaseStandard.csproj
index 329a2501e..c6db5969b 100644
--- a/src/MSDIAL4/DatabaseStandard/DatabaseStandard.csproj
+++ b/src/MSDIAL4/DatabaseStandard/DatabaseStandard.csproj
@@ -30,7 +30,7 @@
-
+
diff --git a/src/MSDIAL4/MathematicsStandard/MathematicsStandard.csproj b/src/MSDIAL4/MathematicsStandard/MathematicsStandard.csproj
index 365073eeb..ff7c9ea74 100644
--- a/src/MSDIAL4/MathematicsStandard/MathematicsStandard.csproj
+++ b/src/MSDIAL4/MathematicsStandard/MathematicsStandard.csproj
@@ -7,7 +7,7 @@
-
+
diff --git a/src/MSDIAL4/StructureFinderStandard/StructureFinderStandard.csproj b/src/MSDIAL4/StructureFinderStandard/StructureFinderStandard.csproj
index 06c1532fb..d6c69907f 100644
--- a/src/MSDIAL4/StructureFinderStandard/StructureFinderStandard.csproj
+++ b/src/MSDIAL4/StructureFinderStandard/StructureFinderStandard.csproj
@@ -15,7 +15,7 @@
-
+
diff --git a/src/MSDIAL5/MsdialCore/Algorithm/Annotation/AnnotatorContainer.cs b/src/MSDIAL5/MsdialCore/Algorithm/Annotation/AnnotatorContainer.cs
index 489258cb4..1280ff7f7 100644
--- a/src/MSDIAL5/MsdialCore/Algorithm/Annotation/AnnotatorContainer.cs
+++ b/src/MSDIAL5/MsdialCore/Algorithm/Annotation/AnnotatorContainer.cs
@@ -81,7 +81,17 @@ public DatabaseAnnotatorContainer(
AnnotatorKey = annotatorKey;
Parameter = parameter;
Database = database;
- AnnotatorID = AnnotatorKey.Key;
+ AnnotatorID = annotatorKey.Key;
+ }
+
+ public DatabaseAnnotatorContainer(
+ IReferRestorationKey annotatorKey,
+ MoleculeDataBase database,
+ MsRefSearchParameterBase parameter) {
+ AnnotatorKey = annotatorKey;
+ Parameter = parameter;
+ Database = database;
+ AnnotatorID = annotatorKey.Key;
}
[IgnoreMember]
@@ -90,7 +100,7 @@ public DatabaseAnnotatorContainer(
public string AnnotatorID { get; }
[Key("AnnotatorKey")]
- public IReferRestorationKey, MoleculeMsReference, MsScanMatchResult, MoleculeDataBase> AnnotatorKey { get; set; }
+ public IReferRestorationKey AnnotatorKey { get; set; }
[Key("Parameter")]
public MsRefSearchParameterBase Parameter { get; set; }
@@ -109,7 +119,7 @@ public void Save(Stream stream) {
public void Load(Stream stream, ILoadAnnotatorVisitor visitor) {
Database.Load(stream, null);
- Annotator = AnnotatorKey.Accept(visitor, Database);
+ Annotator = AnnotatorKey.Accept, MoleculeMsReference, MsScanMatchResult, MoleculeDataBase>(visitor, Database);
}
}
@@ -152,13 +162,38 @@ public ShotgunProteomicsDBAnnotatorContainer(
AnnotatorID = AnnotatorKey.Key;
}
+ public ShotgunProteomicsDBAnnotatorContainer(
+ IReferRestorationKey annotatorKey,
+ ShotgunProteomicsDB database,
+ MsRefSearchParameterBase msRefSearchParameter,
+ ProteomicsParameter proteomicsParameter) {
+ AnnotatorKey = annotatorKey;
+ MsRefSearchParameter = msRefSearchParameter;
+ ProteomicsParameter = proteomicsParameter;
+ Database = database;
+ AnnotatorID = AnnotatorKey.Key;
+ }
+
+ [SerializationConstructor]
+ public ShotgunProteomicsDBAnnotatorContainer(
+ IReferRestorationKey annotatorKey,
+ ShotgunProteomicsDB database,
+ MsRefSearchParameterBase msRefSearchParameter,
+ ProteomicsParameter proteomicsParameter) {
+ AnnotatorKey = annotatorKey;
+ MsRefSearchParameter = msRefSearchParameter;
+ ProteomicsParameter = proteomicsParameter;
+ Database = database;
+ AnnotatorID = AnnotatorKey.Key;
+ }
+
[IgnoreMember]
public ISerializableAnnotator Annotator { get; private set; }
[IgnoreMember]
public string AnnotatorID { get; }
[Key("AnnotatorKey")]
- public IReferRestorationKey AnnotatorKey { get; set; }
+ public IReferRestorationKey AnnotatorKey { get; set; }
[Key("MsRefSearchParameter")]
public MsRefSearchParameterBase MsRefSearchParameter { get; set; }
@@ -181,7 +216,7 @@ public void Save(Stream stream) {
public void Load(Stream stream, ILoadAnnotatorVisitor visitor) {
Database.Load(null, null);
- Annotator = AnnotatorKey.Accept(visitor, Database);
+ Annotator = AnnotatorKey.Accept(visitor, Database);
}
}
@@ -221,18 +256,29 @@ public EadLipidDatabaseAnnotatorContainer(
AnnotatorID = AnnotatorKey.Key;
}
+ [SerializationConstructor]
+ public EadLipidDatabaseAnnotatorContainer(
+ IReferRestorationKey annotatorKey,
+ EadLipidDatabase database,
+ MsRefSearchParameterBase parameter) {
+ AnnotatorKey = annotatorKey;
+ Parameter = parameter;
+ Database = database;
+ AnnotatorID = AnnotatorKey.Key;
+ }
+
[IgnoreMember]
public ISerializableAnnotator<(IAnnotationQuery, MoleculeMsReference), MoleculeMsReference, MsScanMatchResult, EadLipidDatabase> Annotator { get; private set; }
[IgnoreMember]
public string AnnotatorID { get; }
- [Key(nameof(AnnotatorKey))]
- public IReferRestorationKey<(IAnnotationQuery, MoleculeMsReference), MoleculeMsReference, MsScanMatchResult, EadLipidDatabase> AnnotatorKey { get; set; }
+ [Key("AnnotatorKey")]
+ public IReferRestorationKey AnnotatorKey { get; set; }
- [Key(nameof(Parameter))]
+ [Key("Parameter")]
public MsRefSearchParameterBase Parameter { get; set; }
- [Key(nameof(Database))]
+ [Key("Database")]
public EadLipidDatabase Database { get; set; }
[IgnoreMember]
@@ -247,7 +293,7 @@ public void Save(Stream stream) {
public void Load(Stream stream, ILoadAnnotatorVisitor visitor) {
Database.Load(stream, null);
- Annotator = AnnotatorKey.Accept(visitor, Database);
+ Annotator = AnnotatorKey.Accept<(IAnnotationQuery, MoleculeMsReference), MoleculeMsReference, MsScanMatchResult, EadLipidDatabase>(visitor, Database);
}
}
}
diff --git a/src/MSDIAL5/MsdialCore/Algorithm/Annotation/IAnnotationQueryFactory.cs b/src/MSDIAL5/MsdialCore/Algorithm/Annotation/IAnnotationQueryFactory.cs
index a13bdfd35..26e976d9c 100644
--- a/src/MSDIAL5/MsdialCore/Algorithm/Annotation/IAnnotationQueryFactory.cs
+++ b/src/MSDIAL5/MsdialCore/Algorithm/Annotation/IAnnotationQueryFactory.cs
@@ -1,5 +1,4 @@
-using Accord.Collections;
-using CompMs.Common.Components;
+using CompMs.Common.Components;
using CompMs.Common.DataObj;
using CompMs.Common.DataObj.Property;
using CompMs.Common.DataObj.Result;
diff --git a/src/MSDIAL5/MsdialCore/DataObj/AnnotatedMSDecResult.cs b/src/MSDIAL5/MsdialCore/DataObj/AnnotatedMSDecResult.cs
index 63c093fc2..b1b9c95ed 100644
--- a/src/MSDIAL5/MsdialCore/DataObj/AnnotatedMSDecResult.cs
+++ b/src/MSDIAL5/MsdialCore/DataObj/AnnotatedMSDecResult.cs
@@ -8,6 +8,8 @@
using MessagePack;
using MessagePack.Formatters;
using System.IO;
+using System.Buffers;
+using System;
namespace CompMs.MsdialCore.DataObj
{
@@ -62,38 +64,39 @@ public static AnnotatedMSDecResult Load(Stream stream) {
return MessagePackDefaultHandler.LoadFromStream(stream);
}
- internal class AnnotatedMSDecResultFormatter : IMessagePackFormatter
+ internal class AnnotatedMSDecResultFormatter : IMessagePackFormatter
{
- public AnnotatedMSDecResult Deserialize(byte[] bytes, int offset, IFormatterResolver formatterResolver, out int readSize) {
- var currentOffset = offset;
- var contentSize = MessagePackBinary.ReadArrayHeader(bytes, currentOffset, out int readTmp);
- currentOffset += readTmp;
- var raw = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, currentOffset, formatterResolver, out readTmp);
- currentOffset += readTmp;
- var memory = new MemoryStream(raw, 0, raw.Length, writable: false);
+ public AnnotatedMSDecResult Deserialize(ref MessagePackReader reader, MessagePackSerializerOptions options) {
+ if (reader.TryReadNil()) {
+ return null;
+ }
+ var count = reader.ReadArrayHeader();
+ if (count != 4) {
+ throw new MessagePackSerializationException($"Unexpected array length for {nameof(AnnotatedMSDecResult)}: {count}.");
+ }
+ var raw = reader.ReadBytes().GetValueOrDefault();
+ var rawBytes = raw.IsEmpty ? [] : raw.ToArray();
+ using var memory = new MemoryStream(rawBytes, 0, rawBytes.Length, writable: false);
var mSDecResult = MsdecResultsReader.ReadMSDecResultVer1(memory, isAnnotationInfoIncluded: false);
- var matchResults = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, currentOffset, formatterResolver, out readTmp);
- currentOffset += readTmp;
- var molecule = MoleculePropertyExtension.Formatter.Deserialize(bytes, currentOffset, formatterResolver, out readTmp);
- currentOffset += readTmp;
- var quantMass = formatterResolver.GetFormatterWithVerify().Deserialize(bytes, currentOffset, formatterResolver, out readTmp);
- currentOffset += readTmp;
- readSize = currentOffset - offset;
+ var matchResults = options.Resolver.GetFormatterWithVerify().Deserialize(ref reader, options);
+ var molecule = options.Resolver.GetFormatterWithVerify().Deserialize(ref reader, options);
+ var quantMass = reader.ReadDouble();
return new AnnotatedMSDecResult(mSDecResult, matchResults, molecule, quantMass);
}
- public int Serialize(ref byte[] bytes, int offset, AnnotatedMSDecResult value, IFormatterResolver formatterResolver) {
- var currentOffset = offset;
- currentOffset += MessagePackBinary.WriteArrayHeader(ref bytes, currentOffset, 4);
- var memory = new MemoryStream();
+ public void Serialize(ref MessagePackWriter writer, AnnotatedMSDecResult value, MessagePackSerializerOptions options) {
+ if (value is null) {
+ writer.WriteNil();
+ return;
+ }
+ writer.WriteArrayHeader(4);
+ using var memory = new MemoryStream();
MsdecResultsWriter.MSDecWriterVer1(memory, value.MSDecResult);
- memory.Close();
var buffer = memory.ToArray();
- currentOffset += formatterResolver.GetFormatterWithVerify().Serialize(ref bytes, currentOffset, buffer, formatterResolver);
- currentOffset += formatterResolver.GetFormatterWithVerify().Serialize(ref bytes, currentOffset, value.MatchResults, formatterResolver);
- currentOffset += MoleculePropertyExtension.Formatter.Serialize(ref bytes, currentOffset, value.Molecule, formatterResolver);
- currentOffset += formatterResolver.GetFormatterWithVerify().Serialize(ref bytes, currentOffset, value.QuantMass, formatterResolver);
- return currentOffset - offset;
+ writer.Write(buffer);
+ options.Resolver.GetFormatterWithVerify().Serialize(ref writer, value.MatchResults, options);
+ options.Resolver.GetFormatterWithVerify().Serialize(ref writer, value.Molecule, options);
+ writer.Write(value.QuantMass);
}
}
}
diff --git a/src/MSDIAL5/MsdialCore/DataObj/ChromatogramPeakFeature.cs b/src/MSDIAL5/MsdialCore/DataObj/ChromatogramPeakFeature.cs
index cfd92d29e..fc2206241 100644
--- a/src/MSDIAL5/MsdialCore/DataObj/ChromatogramPeakFeature.cs
+++ b/src/MSDIAL5/MsdialCore/DataObj/ChromatogramPeakFeature.cs
@@ -297,7 +297,8 @@ public MsScanMatchResultContainer MatchResults {
set => matchResults = value;
}
- [Key(50)]
+ //[Key(50)]
+ [IgnoreMember]
private MsScanMatchResultContainer matchResults;
[IgnoreMember]
@@ -494,21 +495,25 @@ public void SetMs2SpectrumId(PeakMs2Spectra spectra) {
}
// ISpectrumPeak
+ [IgnoreMember]
double ISpectrumPeak.Intensity {
get => PeakFeature.PeakHeightTop;
set => PeakFeature.PeakHeightTop = value;
}
+ [IgnoreMember]
double ISpectrumPeak.Mass {
get => PrecursorMz;
set => PrecursorMz = value;
}
// IChromatogramPeak
+ [IgnoreMember]
int IChromatogramPeak.ID {
get => MasterPeakID;
}
+ [IgnoreMember]
ChromXs IChromatogramPeak.ChromXs {
get => PeakFeature.ChromXsTop;
set => PeakFeature.ChromXsTop = value;
diff --git a/src/MSDIAL5/MsdialCore/DataObj/DataBaseItem.cs b/src/MSDIAL5/MsdialCore/DataObj/DataBaseItem.cs
index 0e5c45c08..3991f7538 100644
--- a/src/MSDIAL5/MsdialCore/DataObj/DataBaseItem.cs
+++ b/src/MSDIAL5/MsdialCore/DataObj/DataBaseItem.cs
@@ -17,17 +17,30 @@ public DataBaseItem(
List> pairs) {
DataBase = dataBase;
Pairs = pairs;
+ PairsForSerialization = pairs;
+ }
+
+ [SerializationConstructor]
+ public DataBaseItem(
+ TDataBase dataBase,
+ IReadOnlyList pairsForSerialization) {
+ DataBase = dataBase;
+ Pairs = pairsForSerialization.Cast>().ToList();
+ PairsForSerialization = Pairs;
}
[IgnoreMember]
public string DataBaseID => DataBase.Id;
- [Key(nameof(DataBase))]
+ [Key("DataBase")]
public TDataBase DataBase { get; }
- [Key(nameof(Pairs))]
+ [IgnoreMember]
public List> Pairs { get; }
+ [Key("Pairs")]
+ public IReadOnlyList PairsForSerialization { get; }
+
private static readonly string DataBasePath = "DataBase";
private static readonly string AnnotatorsPath = "Annotators";
diff --git a/src/MSDIAL5/MsdialCore/DataObj/EadLipidAnnotatorParameterPair.cs b/src/MSDIAL5/MsdialCore/DataObj/EadLipidAnnotatorParameterPair.cs
index ab4dbcecd..9277eff11 100644
--- a/src/MSDIAL5/MsdialCore/DataObj/EadLipidAnnotatorParameterPair.cs
+++ b/src/MSDIAL5/MsdialCore/DataObj/EadLipidAnnotatorParameterPair.cs
@@ -14,13 +14,17 @@ public EadLipidAnnotatorParameterPair(IAnnotationQueryFactoryGenerationKey serializableAnnotatorKey) {
SerializableAnnotatorKey = serializableAnnotatorKey ?? throw new System.ArgumentNullException(nameof(serializableAnnotatorKey));
}
- [Key(nameof(SerializableAnnotatorKey))]
- public IAnnotationQueryFactoryGenerationKey SerializableAnnotatorKey { get; }
+ [SerializationConstructor]
+ public EadLipidAnnotatorParameterPair(IReferRestorationKey serializableAnnotatorKey) {
+ SerializableAnnotatorKey = serializableAnnotatorKey ?? throw new System.ArgumentNullException(nameof(serializableAnnotatorKey));
+ }
+
+ [Key("SerializableAnnotatorKey")]
+ public IReferRestorationKey SerializableAnnotatorKey { get; }
[IgnoreMember]
public IAnnotationQueryFactory AnnotationQueryFactory { get; private set; }
diff --git a/src/MSDIAL5/MsdialCore/DataObj/IAnnotatorParameterPair.cs b/src/MSDIAL5/MsdialCore/DataObj/IAnnotatorParameterPair.cs
index be5e0caf6..cd7735a75 100644
--- a/src/MSDIAL5/MsdialCore/DataObj/IAnnotatorParameterPair.cs
+++ b/src/MSDIAL5/MsdialCore/DataObj/IAnnotatorParameterPair.cs
@@ -9,7 +9,12 @@ namespace CompMs.MsdialCore.DataObj
[Union(0, typeof(MetabolomicsAnnotatorParameterPair))]
[Union(1, typeof(ProteomicsAnnotatorParameterPair))]
[Union(2, typeof(EadLipidAnnotatorParameterPair))]
- public interface IAnnotatorParameterPair where TDataBase : IReferenceDataBase
+ public interface IAnnotatorParameterPair
+ {
+
+ }
+
+ public interface IAnnotatorParameterPair : IAnnotatorParameterPair where TDataBase : IReferenceDataBase
{
string AnnotatorID { get; }
IAnnotationQueryFactory AnnotationQueryFactory { get; }
diff --git a/src/MSDIAL5/MsdialCore/DataObj/MetabolomicsAnnotatorParameterPair.cs b/src/MSDIAL5/MsdialCore/DataObj/MetabolomicsAnnotatorParameterPair.cs
index d95247ca0..8d6cef041 100644
--- a/src/MSDIAL5/MsdialCore/DataObj/MetabolomicsAnnotatorParameterPair.cs
+++ b/src/MSDIAL5/MsdialCore/DataObj/MetabolomicsAnnotatorParameterPair.cs
@@ -15,12 +15,12 @@ public MetabolomicsAnnotatorParameterPair(IAnnotationQueryFactoryGenerationKey serializableAnnotatorKey) {
+ public MetabolomicsAnnotatorParameterPair(IReferRestorationKey serializableAnnotatorKey) {
SerializableAnnotatorKey = serializableAnnotatorKey ?? throw new System.ArgumentNullException(nameof(serializableAnnotatorKey));
}
- [Key(nameof(SerializableAnnotatorKey))]
- public IAnnotationQueryFactoryGenerationKey SerializableAnnotatorKey { get; }
+ [Key("SerializableAnnotatorKey")]
+ public IReferRestorationKey SerializableAnnotatorKey { get; }
[IgnoreMember]
public string AnnotatorID => AnnotationQueryFactory?.AnnotatorId ?? SerializableAnnotatorKey.Key;
diff --git a/src/MSDIAL5/MsdialCore/DataObj/MsdialDataStorage.cs b/src/MSDIAL5/MsdialCore/DataObj/MsdialDataStorage.cs
index 37c6bb657..740575ba0 100644
--- a/src/MSDIAL5/MsdialCore/DataObj/MsdialDataStorage.cs
+++ b/src/MSDIAL5/MsdialCore/DataObj/MsdialDataStorage.cs
@@ -33,7 +33,6 @@ public interface IMsdialDataStorage where T : ParameterBase {
AnnotationQueryFactoryStorage CreateAnnotationQueryFactoryStorage();
}
- [MessagePackObject]
public abstract class MsdialDataStorageBase
{
[Key(0)]
diff --git a/src/MSDIAL5/MsdialCore/DataObj/ProteomicsAnnotatorParameterPair.cs b/src/MSDIAL5/MsdialCore/DataObj/ProteomicsAnnotatorParameterPair.cs
index 0f191dbeb..c9f6f3cf5 100644
--- a/src/MSDIAL5/MsdialCore/DataObj/ProteomicsAnnotatorParameterPair.cs
+++ b/src/MSDIAL5/MsdialCore/DataObj/ProteomicsAnnotatorParameterPair.cs
@@ -17,15 +17,15 @@ public ProteomicsAnnotatorParameterPair(IAnnotationQueryFactoryGenerationKey serializableAnnotatorKey, ProteomicsParameter proteomicsParameter) {
+ public ProteomicsAnnotatorParameterPair(IReferRestorationKey serializableAnnotatorKey, ProteomicsParameter proteomicsParameter) {
SerializableAnnotatorKey = serializableAnnotatorKey ?? throw new System.ArgumentNullException(nameof(serializableAnnotatorKey));
ProteomicsParameter = proteomicsParameter ?? throw new System.ArgumentNullException(nameof(proteomicsParameter));
}
- [Key(nameof(SerializableAnnotatorKey))]
- public IAnnotationQueryFactoryGenerationKey SerializableAnnotatorKey { get; }
+ [Key("SerializableAnnotatorKey")]
+ public IReferRestorationKey SerializableAnnotatorKey { get; }
- [Key(nameof(ProteomicsParameter))]
+ [Key("ProteomicsParameter")]
public ProteomicsParameter ProteomicsParameter { get; }
[IgnoreMember]
diff --git a/src/MSDIAL5/MsdialCore/DataObj/ShotgunProteomicsDB.cs b/src/MSDIAL5/MsdialCore/DataObj/ShotgunProteomicsDB.cs
index 656dc7d90..8243d45a7 100644
--- a/src/MSDIAL5/MsdialCore/DataObj/ShotgunProteomicsDB.cs
+++ b/src/MSDIAL5/MsdialCore/DataObj/ShotgunProteomicsDB.cs
@@ -1,28 +1,23 @@
using CompMs.Common.Components;
using CompMs.Common.DataObj.Result;
-using CompMs.Common.Enum;
using CompMs.Common.Extension;
using CompMs.Common.MessagePack;
-using CompMs.Common.Parameter;
using CompMs.Common.Parser;
using CompMs.Common.Proteomics.DataObj;
using CompMs.Common.Proteomics.Function;
using CompMs.MsdialCore.Algorithm.Annotation;
using CompMs.MsdialCore.Enum;
using CompMs.MsdialCore.Parameter;
-using CompMs.MsdialCore.Parser;
using CompMs.MsdialCore.Utility;
using MessagePack;
using System;
using System.Collections.Generic;
using System.IO;
-using System.IO.Compression;
-using System.Linq;
namespace CompMs.MsdialCore.DataObj {
[MessagePackObject]
public class ShotgunProteomicsDB : IDisposable, IReferenceDataBase, IMatchResultRefer {
- [Key(19)]
+ [IgnoreMember]
private bool disposedValue;
[Key(1)]
diff --git a/src/MSDIAL5/MsdialCore/Parser/IReferRestorationKey.cs b/src/MSDIAL5/MsdialCore/Parser/IReferRestorationKey.cs
index 8d755b867..37fad8f53 100644
--- a/src/MSDIAL5/MsdialCore/Parser/IReferRestorationKey.cs
+++ b/src/MSDIAL5/MsdialCore/Parser/IReferRestorationKey.cs
@@ -3,28 +3,26 @@
namespace CompMs.MsdialCore.Parser
{
- [MessagePack.Union(0, typeof(DataBaseRestorationKey))]
[MessagePack.Union(1, typeof(MspDbRestorationKey))]
[MessagePack.Union(2, typeof(TextDbRestorationKey))]
[MessagePack.Union(3, typeof(StandardRestorationKey))]
[MessagePack.Union(4, typeof(ShotgunProteomicsRestorationKey))]
[MessagePack.Union(5, typeof(EadLipidDatabaseRestorationKey))]
+ public interface IReferRestorationKey
+ {
+ ISerializableAnnotator Accept(ILoadAnnotatorVisitor visitor, TDatabase database);
+ IAnnotationQueryFactory Accept(IAnnotationQueryFactoryGenerationVisitor factoryVisitor, ILoadAnnotatorVisitor annotatorVisitor, TDatabase database);
+
+ int Priority { get; }
+ string Key { get; }
+ }
+
public interface IReferRestorationKey : IAnnotationQueryFactoryGenerationKey
{
ISerializableAnnotator Accept(ILoadAnnotatorVisitor visitor, TDatabase database);
}
- [MessagePack.Union(0, typeof(DataBaseRestorationKey))]
- [MessagePack.Union(1, typeof(MspDbRestorationKey))]
- [MessagePack.Union(2, typeof(TextDbRestorationKey))]
- [MessagePack.Union(3, typeof(StandardRestorationKey))]
- [MessagePack.Union(4, typeof(ShotgunProteomicsRestorationKey))]
- [MessagePack.Union(5, typeof(EadLipidDatabaseRestorationKey))]
- public interface IAnnotationQueryFactoryGenerationKey {
- IAnnotationQueryFactory Accept(IAnnotationQueryFactoryGenerationVisitor factoryVisitor, ILoadAnnotatorVisitor annoatorVIsitor, TDatabase database);
-
- string Key { get; }
-
- int Priority { get; }
+ public interface IAnnotationQueryFactoryGenerationKey : IReferRestorationKey {
+ IAnnotationQueryFactory Accept(IAnnotationQueryFactoryGenerationVisitor factoryVisitor, ILoadAnnotatorVisitor annotatorVisitor, TDatabase database);
}
}
diff --git a/src/MSDIAL5/MsdialCore/Parser/ReferRestorationKey.cs b/src/MSDIAL5/MsdialCore/Parser/ReferRestorationKey.cs
index 3f70514c8..2cb89b3d5 100644
--- a/src/MSDIAL5/MsdialCore/Parser/ReferRestorationKey.cs
+++ b/src/MSDIAL5/MsdialCore/Parser/ReferRestorationKey.cs
@@ -1,4 +1,5 @@
-using CompMs.Common.Components;
+using System;
+using CompMs.Common.Components;
using CompMs.Common.DataObj.Result;
using CompMs.Common.Parameter;
using CompMs.Common.Proteomics.DataObj;
@@ -6,9 +7,14 @@
using CompMs.MsdialCore.DataObj;
using CompMs.MsdialCore.Parameter;
+[assembly: MessagePack.MessagePackAssumedFormattable(typeof(IAnnotationQuery))]
+[assembly: MessagePack.MessagePackAssumedFormattable(typeof((IAnnotationQuery, MoleculeMsReference)))]
+
namespace CompMs.MsdialCore.Parser
{
- [MessagePack.MessagePackObject]
+ [MessagePack.Union(1, typeof(MspDbRestorationKey))]
+ [MessagePack.Union(2, typeof(TextDbRestorationKey))]
+ [MessagePack.Union(3, typeof(StandardRestorationKey))]
public abstract class DataBaseRestorationKey : IReferRestorationKey, MoleculeMsReference, MsScanMatchResult, MoleculeDataBase>
{
public DataBaseRestorationKey(string key, int priority) {
@@ -24,6 +30,22 @@ public DataBaseRestorationKey(string key, int priority) {
public abstract ISerializableAnnotator, MoleculeMsReference, MsScanMatchResult, MoleculeDataBase> Accept(ILoadAnnotatorVisitor visitor, MoleculeDataBase database);
public abstract IAnnotationQueryFactory Accept(IAnnotationQueryFactoryGenerationVisitor factoryVisitor, ILoadAnnotatorVisitor annotatorVisitor, MoleculeDataBase database);
+
+ public ISerializableAnnotator Accept(ILoadAnnotatorVisitor visitor, TDatabase database)
+ {
+ if (typeof(TQuery) == typeof(IAnnotationQuery) && typeof(TReference) == typeof(MoleculeMsReference) && typeof(TResult) == typeof(MsScanMatchResult) && typeof(TDatabase) == typeof(MoleculeDataBase)) {
+ return (ISerializableAnnotator)Accept(visitor, database as MoleculeDataBase);
+ }
+ throw new NotSupportedException($"Unsupported type: {typeof(TQuery)}, {typeof(TReference)}, {typeof(TResult)}, {typeof(TDatabase)}");
+ }
+
+ public IAnnotationQueryFactory Accept(IAnnotationQueryFactoryGenerationVisitor factoryVisitor, ILoadAnnotatorVisitor annotatorVisitor, TDatabase database)
+ {
+ if (typeof(TDatabase) == typeof(MoleculeDataBase)) {
+ return Accept(factoryVisitor, annotatorVisitor, database as MoleculeDataBase);
+ }
+ throw new NotSupportedException($"Unsupported type: {typeof(TDatabase)}");
+ }
}
[MessagePack.MessagePackObject]
@@ -81,7 +103,7 @@ public override IAnnotationQueryFactory Accept(IAnnotationQue
}
}
- [MessagePack.MessagePackObject]
+ [MessagePack.Union(4, typeof(ShotgunProteomicsRestorationKey))]
public abstract class FastaDbRestorationKey : IReferRestorationKey {
public FastaDbRestorationKey(string key, int priority) {
Key = key;
@@ -96,6 +118,22 @@ public FastaDbRestorationKey(string key, int priority) {
public abstract ISerializableAnnotator Accept(ILoadAnnotatorVisitor visitor, ShotgunProteomicsDB database);
public abstract IAnnotationQueryFactory Accept(IAnnotationQueryFactoryGenerationVisitor factoryVisitor, ILoadAnnotatorVisitor annotatorVisitor, ShotgunProteomicsDB database);
+
+ public ISerializableAnnotator Accept(ILoadAnnotatorVisitor visitor, TDatabase database)
+ {
+ if (typeof(TQuery) == typeof(IPepAnnotationQuery) && typeof(TReference) == typeof(PeptideMsReference) && typeof(TResult) == typeof(MsScanMatchResult) && typeof(TDatabase) == typeof(ShotgunProteomicsDB)) {
+ return (ISerializableAnnotator)Accept(visitor, database as ShotgunProteomicsDB);
+ }
+ throw new NotSupportedException($"Unsupported type: {typeof(TQuery)}, {typeof(TReference)}, {typeof(TResult)}, {typeof(TDatabase)}");
+ }
+
+ public IAnnotationQueryFactory Accept(IAnnotationQueryFactoryGenerationVisitor factoryVisitor, ILoadAnnotatorVisitor annotatorVisitor, TDatabase database)
+ {
+ if (typeof(TDatabase) == typeof(ShotgunProteomicsDB)) {
+ return Accept(factoryVisitor, annotatorVisitor, database as ShotgunProteomicsDB);
+ }
+ throw new NotSupportedException($"Unsupported type: {typeof(TDatabase)}");
+ }
}
[MessagePack.MessagePackObject]
@@ -158,5 +196,21 @@ public EadLipidDatabaseRestorationKey(string key, int priority, MsRefSearchParam
public IAnnotationQueryFactory Accept(IAnnotationQueryFactoryGenerationVisitor factoryVisitor, ILoadAnnotatorVisitor annotatorVisitor, EadLipidDatabase database) {
return factoryVisitor.Visit(this, annotatorVisitor.Visit(this, database));
}
+
+ public ISerializableAnnotator Accept(ILoadAnnotatorVisitor visitor, TDatabase database)
+ {
+ if (typeof(TQuery) == typeof((IAnnotationQuery, MoleculeMsReference)) && typeof(TReference) == typeof(MoleculeMsReference) && typeof(TResult) == typeof(MsScanMatchResult) && typeof(TDatabase) == typeof(EadLipidDatabase)) {
+ return (ISerializableAnnotator)Accept(visitor, database as EadLipidDatabase);
+ }
+ throw new NotSupportedException($"Unsupported type: {typeof(TQuery)}, {typeof(TReference)}, {typeof(TResult)}, {typeof(TDatabase)}");
+ }
+
+ public IAnnotationQueryFactory Accept(IAnnotationQueryFactoryGenerationVisitor factoryVisitor, ILoadAnnotatorVisitor annotatorVisitor, TDatabase database)
+ {
+ if (typeof(TDatabase) == typeof(EadLipidDatabase)) {
+ return Accept(factoryVisitor, annotatorVisitor, database as EadLipidDatabase);
+ }
+ throw new NotSupportedException($"Unsupported type: {typeof(TDatabase)}");
+ }
}
}
diff --git a/src/MSDIAL5/MsdialGuiApp/MsdialGuiApp.csproj b/src/MSDIAL5/MsdialGuiApp/MsdialGuiApp.csproj
index 8c5f97998..7e0ecc438 100644
--- a/src/MSDIAL5/MsdialGuiApp/MsdialGuiApp.csproj
+++ b/src/MSDIAL5/MsdialGuiApp/MsdialGuiApp.csproj
@@ -78,7 +78,7 @@
-
+
diff --git a/src/MSDIAL5/SpectrumViewer/SpectrumViewer.csproj b/src/MSDIAL5/SpectrumViewer/SpectrumViewer.csproj
index ca8603c2d..00aa2e7b4 100644
--- a/src/MSDIAL5/SpectrumViewer/SpectrumViewer.csproj
+++ b/src/MSDIAL5/SpectrumViewer/SpectrumViewer.csproj
@@ -60,7 +60,7 @@
-
+
diff --git a/src/MSFINDER/MsfinderConsoleAppCore/MsfinderConsoleAppCore.csproj b/src/MSFINDER/MsfinderConsoleAppCore/MsfinderConsoleAppCore.csproj
index 76b68f794..d7b87fc3c 100644
--- a/src/MSFINDER/MsfinderConsoleAppCore/MsfinderConsoleAppCore.csproj
+++ b/src/MSFINDER/MsfinderConsoleAppCore/MsfinderConsoleAppCore.csproj
@@ -2,7 +2,7 @@
Exe
- netcoreapp3.0;net472
+ netcoreapp3.1;net472
msfinder_icon.ico
MsfinderConsoleApp
Debug;Release;Debug vendor unsupported;Release vendor unsupported
diff --git a/tests/Common/CommonStandardTests/CommonStandardTests.csproj b/tests/Common/CommonStandardTests/CommonStandardTests.csproj
index fd4da24ed..eaec1c2ce 100644
--- a/tests/Common/CommonStandardTests/CommonStandardTests.csproj
+++ b/tests/Common/CommonStandardTests/CommonStandardTests.csproj
@@ -29,6 +29,7 @@
PreserveNewest
+ Resources\Lipidomics\PC_O-16_0_18_1%289%29_[M+H]+.msp.txt
diff --git a/tests/Common/CommonStandardTests/Components/DriftTimeTests.cs b/tests/Common/CommonStandardTests/Components/DriftTimeTests.cs
index 359256896..cc54c4ee2 100644
--- a/tests/Common/CommonStandardTests/Components/DriftTimeTests.cs
+++ b/tests/Common/CommonStandardTests/Components/DriftTimeTests.cs
@@ -11,6 +11,7 @@ public void DriftTimeTest() {
var memory = new MemoryStream();
var dt = new DriftTime(10d, ChromXUnit.K0);
MessagePack.MessagePackDefaultHandler.SaveToStream(dt, memory);
+ memory.Seek(0, SeekOrigin.Begin);
var actual = MessagePack.MessagePackDefaultHandler.LoadFromStream(memory);
Assert.IsInstanceOfType(actual, typeof(DriftTime));
Assert.That.AreEqual(dt, actual);
diff --git a/tests/Common/CommonStandardTests/Components/MoleculePropertyTests.cs b/tests/Common/CommonStandardTests/Components/MoleculePropertyTests.cs
new file mode 100644
index 000000000..78ca80c42
--- /dev/null
+++ b/tests/Common/CommonStandardTests/Components/MoleculePropertyTests.cs
@@ -0,0 +1,82 @@
+using CompMs.Common.Interfaces;
+using MessagePack;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+using System;
+using System.Buffers;
+using System.Collections.Generic;
+using System.Globalization;
+
+namespace CompMs.Common.Components.Tests
+{
+ [TestClass()]
+ public class MoleculePropertyTests
+ {
+ [DataTestMethod()]
+ [DynamicData(nameof(GetSerializedMoleculePropertyTestData))]
+ public void DeserializeSavedMoleculePropertyBytesTest(string name, string hexBytes) {
+ var bytes = HexToBytes(hexBytes);
+
+ var formatter = MoleculePropertyExtension.Formatter;
+ MessagePackReader reader = new MessagePackReader(bytes);
+ var actual = formatter.Deserialize(ref reader, MessagePackSerializerOptions.Standard);
+
+ var arraywriter = new TestBufferWriter();
+ var writer = new MessagePackWriter(arraywriter);
+ formatter.Serialize(ref writer, actual, MessagePackSerializerOptions.Standard);
+ writer.Flush();
+
+ Assert.AreEqual(bytes.Length, reader.Consumed);
+ CollectionAssert.AreEqual(bytes, arraywriter.WrittenMemory.ToArray());
+ Assert.AreEqual(name, actual.Name);
+ }
+
+ public static IEnumerable