### Features
* Fully abstracts serialization by using compile-time attributes.
* Supports serializing the following:
- Primitives (integers, strings, etc)
- IP Addresses
- BigDecimal
- DateTime, Delta DateTimes
- TimeSpan
- Server.Race
- Server.Map
- Point2D, Point3D, Rect2D, Rect3D
- Existing/New `ISerializable` references
- Lists/Sets of serializable types
- Type with a `Serialize` method and constructor that takes an `IGenericReader`
* Supports forward-only migration
* Supports existing RunUO deserialization for older versions by changing to the following signature:
- `public void OldDeserialize(IGenericReader reader, int version)`
- Must remove deserializing the version since this is already done
* Supports serializing from private fields or custom made properties.
* Types do not require inheriting Item/Mobile. Code gen will fully create `ISerializable` information.
- This is not recommended yet, since it requires wiring to `Persistence` which will cause lots of unresolved symbol errors until code gen is built.
### Example
```cs
using System.Collections.Generic;
namespace Server.Items
{
[Serializable(1)]
public partial class TestItem1 : Item
{
[SerializableField(1)]
[SerializableFieldAttr("[CommandProperty(AccessLevel.Administrator)]")]
private List<Item> _someProperty;
private void Deserialize(IGenericReader reader, int version)
{
}
}
}
```
Generates this:
```cs
namespace Server.Items
{
public partial class TestItem1
{
#pragma warning disable 0414
private const int _version = 1;
#pragma warning restore 0414
[CommandProperty(AccessLevel.Administrator)]
public System.Collections.Generic.List<Server.Item> SomeProperty
{
get => _someProperty;
set
{
if (value != _someProperty)
{
((ISerializable)this).MarkDirty();
_someProperty = value;
}
}
}
public TestItem1(Serial serial) : base(serial)
{
}
public override void Serialize(IGenericWriter writer)
{
var savePosition = ((Server.ISerializable)this).SavePosition;
if (savePosition > -1)
{
writer.Seek(savePosition, System.IO.SeekOrigin.Begin);
return;
}
writer.WriteEncodedInt(_version);
writer.Write(_someProperty);
}
public override void Deserialize(IGenericReader reader)
{
var version = reader.ReadEncodedInt();
if (version < 1)
{
OldDeserialize(reader, version);
((Server.ISerializable)this).MarkDirty();
return;
}
SomeProperty = reader.ReadEntityList<Server.Item>();
}
}
}
```
And this:
```json
{
"version": 1,
"type": "TestItem1",
"properties": [
{
"name": "SomeProperty",
"type": "System.Collections.Generic.List\u003CServer.Item\u003E",
"rule": "ListMigrationRule",
"ruleArguments": [
"Server.Item",
"SerializableInterfaceMigrationRule"
]
}
]
}
```
72 lines
3.8 KiB
XML
Executable file
72 lines
3.8 KiB
XML
Executable file
<?xml version="1.0" encoding="utf-8"?>
|
|
<Project Sdk="Microsoft.NET.Sdk" ToolsVersion="Current">
|
|
<PropertyGroup>
|
|
<OutputType>Exe</OutputType>
|
|
<ApplicationIcon>MUO.ico</ApplicationIcon>
|
|
<StartupObject>Server.Core</StartupObject>
|
|
<AssemblyName>ModernUO</AssemblyName>
|
|
<Win32Resource />
|
|
<Product>ModernUO Server</Product>
|
|
<PublishDir>..\..\Distribution</PublishDir>
|
|
<OutDir>..\..\Distribution</OutDir>
|
|
<Version>0.0.0</Version>
|
|
<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
|
|
<CompilerGeneratedFilesOutputPath>Generated</CompilerGeneratedFilesOutputPath>
|
|
</PropertyGroup>
|
|
<Target Name="CleanPub" AfterTargets="Clean">
|
|
<Message Text="Removing distribution files..." />
|
|
<Delete Files="..\..\Distribution\zlib.dll" ContinueOnError="true" />
|
|
<Delete Files="..\..\Distribution\libz.dylib" ContinueOnError="true" />
|
|
<Delete Files="..\..\Distribution\libz.so" ContinueOnError="true" />
|
|
<Delete Files="..\..\Distribution\ZLib.Bindings.dll" ContinueOnError="true" />
|
|
<Delete Files="..\..\Distribution\Microsoft.Toolkit.HighPerformance.dll" ContinueOnError="true" />
|
|
<Delete Files="..\..\Distribution\Serilog.dll" ContinueOnError="true" />
|
|
<Delete Files="..\..\Distribution\Serilog.Sinks.Async.dll" ContinueOnError="true" />
|
|
<Delete Files="..\..\Distribution\Serilog.Sinks.Console.dll" ContinueOnError="true" />
|
|
<Delete Files="..\..\Distribution\$(AssemblyName)" ContinueOnError="true" />
|
|
<Delete Files="..\..\Distribution\$(AssemblyName).dll" ContinueOnError="true" />
|
|
<Delete Files="..\..\Distribution\ref\$(AssemblyName).dll" ContinueOnError="true" />
|
|
<Delete Files="..\..\Distribution\$(AssemblyName).dll.config" ContinueOnError="true" />
|
|
<Delete Files="..\..\Distribution\$(AssemblyName).exe" ContinueOnError="true" />
|
|
<Delete Files="..\..\Distribution\$(AssemblyName).deps.json" ContinueOnError="true" />
|
|
<Delete Files="..\..\Distribution\$(AssemblyName).pdb" ContinueOnError="true" />
|
|
<Delete Files="..\..\Distribution\$(AssemblyName).runtimeconfig.dev.json" ContinueOnError="true" />
|
|
<Delete Files="..\..\Distribution\$(AssemblyName).runtimeconfig.json" ContinueOnError="true" />
|
|
<RemoveDir Directories="Generated" />
|
|
</Target>
|
|
<ItemGroup>
|
|
<PackageReference Include="Microsoft.Toolkit.HighPerformance" Version="7.0.2" />
|
|
<PackageReference Include="Serilog" Version="2.10.0" />
|
|
<PackageReference Include="Serilog.Sinks.Async" Version="1.4.0" />
|
|
<PackageReference Include="Serilog.Sinks.Console" Version="3.1.1" />
|
|
<PackageReference Include="Zlib.Bindings" Version="1.5.0" />
|
|
</ItemGroup>
|
|
<ItemGroup>
|
|
<ProjectReference Include="..\SerializationGenerator\SerializationGenerator.csproj">
|
|
<SetTargetFramework>TargetFramework=netstandard2.0</SetTargetFramework>
|
|
<OutputItemType>Analyzer</OutputItemType>
|
|
<ReferenceOutputAssembly>false</ReferenceOutputAssembly>
|
|
<PrivateAssets>all</PrivateAssets>
|
|
</ProjectReference>
|
|
</ItemGroup>
|
|
<Target Name="AddSourceGeneratedFiles" AfterTargets="CoreCompile">
|
|
<ItemGroup>
|
|
<Compile Include="Generated\**" />
|
|
</ItemGroup>
|
|
</Target>
|
|
<Target Name="RemoveSourceGeneratedFiles" BeforeTargets="CoreCompile">
|
|
<ItemGroup>
|
|
<Compile Remove="Generated\**" />
|
|
</ItemGroup>
|
|
<RemoveDir Directories="Generated" />
|
|
</Target>
|
|
<ItemGroup>
|
|
<CompilerVisibleProperty Include="SerializableMigrationPath" />
|
|
</ItemGroup>
|
|
<ItemGroup>
|
|
<Folder Include="Migrations" />
|
|
</ItemGroup>
|
|
<PropertyGroup>
|
|
<SerializableMigrationPath>.\Migrations\</SerializableMigrationPath>
|
|
</PropertyGroup>
|
|
</Project>
|