fix(core): Fixes several serialization issues (#355)

- [X] Fixes an issue where a buffer smaller than 8 bytes would not double with enough space in some cases.
- [X] Fixes an issue with dupe copying the savebuffer reference (ugh).
- [X] Streamlines the IGenericWriter API to use better generics.
- [X] Streamlines the IGenericReader API to use better generics.
- [X] Forces `tidying` of a List/HashSet to be done externally since Writers/Readers should not have side effects.
- [X] Fixes an issue where Tidying a list didn't TrimExcess, causing memory leaks.
- [X] Reverted the meaning of `World.Running` to specifically refer to any world state post world loading.
  - NOTE: Do not use this if you want to block on world saves. Instead use checks against `WorldState.Saving` states.
- [X] Fixes an issue with serializing negative DateTime deltas.
- [X] Fixes a potential issue with serializing non-UTC DateTime.

Bumps release version
This commit is contained in:
Kamron Batman 2020-12-23 07:11:41 -08:00 • committed by GitHub
parent 0888ab9b86
commit 4ddb3de026
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
162 changed files with 652 additions and 1045 deletions

View file

@ -260,7 +260,7 @@ namespace Server.Items
case 1:
case 0:
{
Addon = reader.ReadItem() as BaseAddon;
Addon = reader.ReadEntity<BaseAddon>();
Offset = reader.ReadPoint3D();
Addon?.OnComponentLoaded(this);

View file

@ -112,7 +112,7 @@ namespace Server.Items
var version = reader.ReadInt();
Addon = reader.ReadItem() as BaseAddonContainer;
Addon = reader.ReadEntity<BaseAddonContainer>();
Offset = reader.ReadPoint3D();
Addon?.OnComponentLoaded(this);

View file

@ -105,8 +105,11 @@ namespace Server.Items
writer.Write(Topic[i]);
}
writer.Write(Yes, true);
writer.Write(No, true);
Yes.Tidy();
writer.Write(Yes);
No.Tidy();
writer.Write(No);
}
public override void Deserialize(IGenericReader reader)
@ -122,8 +125,8 @@ namespace Server.Items
Topic[i] = reader.ReadString();
}
Yes = reader.ReadStrongMobileList();
No = reader.ReadStrongMobileList();
Yes = reader.ReadEntityList<Mobile>();
No = reader.ReadEntityList<Mobile>();
}
private class InternalGump : Gump

View file

@ -283,7 +283,7 @@ namespace Server.Items
writer.Write(1); // version
writer.WriteItemList(Components);
writer.Write(Components);
}
public override void Deserialize(IGenericReader reader)
@ -297,7 +297,7 @@ namespace Server.Items
case 1:
case 0:
{
Components = reader.ReadStrongItemList<AddonComponent>();
Components = reader.ReadEntityList<AddonComponent>();
break;
}
}

View file

@ -192,7 +192,7 @@ namespace Server.Items
writer.Write(0); // version
writer.WriteItemList(Components);
writer.Write(Components);
writer.Write((int)m_Resource);
}
@ -202,7 +202,7 @@ namespace Server.Items
var version = reader.ReadInt();
Components = reader.ReadStrongItemList<AddonContainerComponent>();
Components = reader.ReadEntityList<AddonContainerComponent>();
m_Resource = (CraftResource)reader.ReadInt();
AddonComponent.ApplyLightTo(this);

View file

@ -115,7 +115,7 @@ namespace Server.Items
var version = reader.ReadInt();
m_Active = reader.ReadBool();
m_TeleDest = reader.ReadItem() as SHTeleComponent;
m_TeleDest = reader.ReadEntity<SHTeleComponent>();
TeleOffset = reader.ReadPoint3D();
}
}
@ -302,10 +302,10 @@ namespace Server.Items
External = reader.ReadBool();
UpTele = (SHTeleComponent)reader.ReadItem();
RightTele = (SHTeleComponent)reader.ReadItem();
DownTele = (SHTeleComponent)reader.ReadItem();
LeftTele = (SHTeleComponent)reader.ReadItem();
UpTele = (SHTeleComponent)reader.ReadEntity<Item>();
RightTele = (SHTeleComponent)reader.ReadEntity<Item>();
DownTele = (SHTeleComponent)reader.ReadEntity<Item>();
LeftTele = (SHTeleComponent)reader.ReadEntity<Item>();
}
public class SHTeleporterCreator

View file

@ -179,7 +179,7 @@ namespace Server.Items
writer.WriteEncodedInt(0); // version
writer.WriteMobileList(m_Spawned);
writer.Write(m_Spawned);
}
public override void Deserialize(IGenericReader reader)
@ -188,7 +188,7 @@ namespace Server.Items
var version = reader.ReadEncodedInt();
m_Spawned = reader.ReadStrongMobileList<Mobile>();
m_Spawned = reader.ReadEntityList<Mobile>();
}
}
}