pwither.formatter
1.0.1
dotnet add package pwither.formatter --version 1.0.1
NuGet\Install-Package pwither.formatter -Version 1.0.1
<PackageReference Include="pwither.formatter" Version="1.0.1" />
paket add pwither.formatter --version 1.0.1
#r "nuget: pwither.formatter, 1.0.1"
// Install pwither.formatter as a Cake Addin #addin nuget:?package=pwither.formatter&version=1.0.1 // Install pwither.formatter as a Cake Tool #tool nuget:?package=pwither.formatter&version=1.0.1
pwither.formatter
Замена BinaryFormatter для .net 8.0 и более поздних версий.
BinaryFormatter, возможно, будет удален в .NET 9. Этот код скопирован из .NET 8.0, поэтому он полностью независим.
Он также не использует FieldAttributes.NotSerialized или Type.IsSerializable (TypeAttributes.Serializable).
Поскольку он независим, это также означает, что он не может ничего делать "из коробки", поскольку никакие типы не приписываются [BitSerializable] или не реализуют BitBinaryFormatter.ISerializable, даже примитивные типы, такие как int.
Для начала измените ваш код следующим образом:
from [Serializable] -> [BitSerializable]
from [NonSerialized] -> [BitNonSerialized]
from ISerializable -> pwither.formatter.ISerializable
и т.д.
Или можете использовать BitBinaryFormatter.Control для настройки этого поведения:
BitBinaryFormatter.Control.IsSerializableHandlers
BitBinaryFormatter.Control.IsNotSerializedHandlers
Теперь вы должны иметь возможность сериализовать свои собственные типы, если они вообще ничего не содержат. А как насчет типов во время выполнения? Да, это WIP, но некоторые типы были добавлены, и вы можете включить их следующим образом:
var bf = new BinaryFormatter();
bf.SurrogateSelector = new ConverterSelector(); // добавить конвертеры по умолчанию, в настоящее время это Dictionary<,>, HashSet<>.
bf.Control.IsSerializableHandlers = new IsSerializableHandlers(); // добавляет обработчики IsSerializable по умолчанию, в настоящее время примитивные типы, List<>, Stack<>, DateTime, KeyValuePair<,>, и т.д.
Пример использования из еще одной моей библиотеки. Представим, что мы имеем следующие типы, которые надо сериализовать через BinaryFormatter:
[BitSerializable]
public class Packager
{
public List<Package> Packages { get; set; }
public PackagerInfo PackageInfo { get; set; }
public Packager(PackagerInfo info) : base()
{
PackageInfo = info;
Packages = new List<Package>();
}
}
[BitSerializable]
public class PackagerInfo
{
public string Name { get; set; }
public string Version { get; set; }
public string Additional { get; set; }
public string AppName { get; set; }
}
[BitSerializable]
public class Package
{
public int ChunkSize { get; set; }
public FilePart[] Parts { get; set; }
public string Name { get; set; }
public string DestinationDirectory { get; set; }
public string Additional { get; set; }
}
[BitSerializable]
public class FilePart
{
public byte[] Part { get; set; }
public long Size { get; set; }
public int Index { get; set; }
}
Для сериализации напишем статический класс, в который поместим следующий код:
public static byte[] PackagerToByteArray(this Packager obj)
{
using (var ms = new MemoryStream())
{
var bf = new BitBinaryFormatter();
bf.SurrogateSelector = new ConverterSelector();
bf.Control.IsSerializableHandlers = new IsSerializableHandlers();
bf.Control.IsSerializableHandlers.Handlers.OfType<SerializeAllowedTypes>().Single().AllowedTypes.Add(typeof(object));
var b = new AllowedTypesBinder();
b.AddAllowedType(typeof(Packager));
b.AddAllowedType(typeof(PackagerInfo));
b.AddAllowedType(typeof(Package));
b.AddAllowedType(typeof(FilePart));
bf.Binder = b;
bf.Serialize(ms, obj);
return ms.ToArray();
}
}
public static Packager ByteArrayToPackager(this byte[] arrBytes)
{
using (var ms = new MemoryStream())
{
ms.Write(arrBytes, 0, arrBytes.Length);
ms.Seek(0, SeekOrigin.Begin);
var bf = new BitBinaryFormatter();
bf.SurrogateSelector = new ConverterSelector();
bf.Control.IsSerializableHandlers = new IsSerializableHandlers();
bf.Control.IsSerializableHandlers.Handlers.OfType<SerializeAllowedTypes>().Single().AllowedTypes.Add(typeof(object));
var b = new AllowedTypesBinder();
b.AddAllowedType(typeof(Packager));
b.AddAllowedType(typeof(PackagerInfo));
b.AddAllowedType(typeof(Package));
b.AddAllowedType(typeof(FilePart));
bf.Binder = b;
return (Packager)bf.Deserialize(ms);
}
}
Вы должны понимать, что это довольно сырая имплементация BinaryFormatter, и в большинстве случаев я рекомендую использовать вам Json или Xml, так как оригинальный BinaryFormatter больше не поддерживается из-за того, что это небезопасно, грубо говоря злоумышленник с помощью бинарной десериализации может вызвать отказ в обслуживании, выполнить произвольный код или раскрыть конфиденциальную информацию, с учетом того, что информационная безопасность становится неотъемлемой частью жизни, эти уязвимости для многих юридических и физических лиц являются критическими, более подробно о причинах отказа от BinaryFormatter написано в Руководстве по безопасности BinaryFormatter
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net7.0 is compatible. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
-
net7.0
- No dependencies.
NuGet packages (1)
Showing the top 1 NuGet packages that depend on pwither.formatter:
Package | Downloads |
---|---|
pwither.IO
Библиотека для работы с частями файлов, файлами, директориями и сжатыми пакетами |
GitHub repositories
This package is not used by any popular GitHub repositories.