mirror of
https://github.com/ppy/osu.git
synced 2025-01-06 06:13:04 +08:00
Merge pull request #17790 from huoyaoyuan/remove-binary-serialization
Remove usages of binary serialization
This commit is contained in:
commit
567d755794
@ -3,11 +3,7 @@
|
|||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Diagnostics;
|
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Reflection;
|
|
||||||
using System.Runtime.Serialization;
|
|
||||||
using System.Runtime.Serialization.Formatters.Binary;
|
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
|
||||||
namespace osu.Game.IO.Legacy
|
namespace osu.Game.IO.Legacy
|
||||||
@ -26,15 +22,6 @@ namespace osu.Game.IO.Legacy
|
|||||||
|
|
||||||
public int RemainingBytes => (int)(stream.Length - stream.Position);
|
public int RemainingBytes => (int)(stream.Length - stream.Position);
|
||||||
|
|
||||||
/// <summary> Static method to take a SerializationInfo object (an input to an ISerializable constructor)
|
|
||||||
/// and produce a SerializationReader from which serialized objects can be read </summary>.
|
|
||||||
public static SerializationReader GetReader(SerializationInfo info)
|
|
||||||
{
|
|
||||||
byte[] byteArray = (byte[])info.GetValue("X", typeof(byte[]));
|
|
||||||
MemoryStream ms = new MemoryStream(byteArray);
|
|
||||||
return new SerializationReader(ms);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary> Reads a string from the buffer. Overrides the base implementation so it can cope with nulls. </summary>
|
/// <summary> Reads a string from the buffer. Overrides the base implementation so it can cope with nulls. </summary>
|
||||||
public override string ReadString()
|
public override string ReadString()
|
||||||
{
|
{
|
||||||
@ -186,98 +173,12 @@ namespace osu.Game.IO.Legacy
|
|||||||
return ReadCharArray();
|
return ReadCharArray();
|
||||||
|
|
||||||
case ObjType.otherType:
|
case ObjType.otherType:
|
||||||
return DynamicDeserializer.Deserialize(BaseStream);
|
throw new IOException("Deserialization of arbitrary type is not supported.");
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class DynamicDeserializer
|
|
||||||
{
|
|
||||||
private static VersionConfigToNamespaceAssemblyObjectBinder versionBinder;
|
|
||||||
private static BinaryFormatter formatter;
|
|
||||||
|
|
||||||
private static void initialize()
|
|
||||||
{
|
|
||||||
versionBinder = new VersionConfigToNamespaceAssemblyObjectBinder();
|
|
||||||
formatter = new BinaryFormatter
|
|
||||||
{
|
|
||||||
// AssemblyFormat = FormatterAssemblyStyle.Simple,
|
|
||||||
Binder = versionBinder
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
public static object Deserialize(Stream stream)
|
|
||||||
{
|
|
||||||
if (formatter == null)
|
|
||||||
initialize();
|
|
||||||
|
|
||||||
Debug.Assert(formatter != null, "formatter != null");
|
|
||||||
|
|
||||||
// ReSharper disable once PossibleNullReferenceException
|
|
||||||
return formatter.Deserialize(stream);
|
|
||||||
}
|
|
||||||
|
|
||||||
#region Nested type: VersionConfigToNamespaceAssemblyObjectBinder
|
|
||||||
|
|
||||||
public sealed class VersionConfigToNamespaceAssemblyObjectBinder : SerializationBinder
|
|
||||||
{
|
|
||||||
private readonly Dictionary<string, Type> cache = new Dictionary<string, Type>();
|
|
||||||
|
|
||||||
public override Type BindToType(string assemblyName, string typeName)
|
|
||||||
{
|
|
||||||
if (cache.TryGetValue(assemblyName + typeName, out var typeToDeserialize))
|
|
||||||
return typeToDeserialize;
|
|
||||||
|
|
||||||
List<Type> tmpTypes = new List<Type>();
|
|
||||||
Type genType = null;
|
|
||||||
|
|
||||||
if (typeName.Contains("System.Collections.Generic") && typeName.Contains("[["))
|
|
||||||
{
|
|
||||||
string[] splitTypes = typeName.Split('[');
|
|
||||||
|
|
||||||
foreach (string typ in splitTypes)
|
|
||||||
{
|
|
||||||
if (typ.Contains("Version"))
|
|
||||||
{
|
|
||||||
string asmTmp = typ.Substring(typ.IndexOf(',') + 1);
|
|
||||||
string asmName = asmTmp.Remove(asmTmp.IndexOf(']')).Trim();
|
|
||||||
string typName = typ.Remove(typ.IndexOf(','));
|
|
||||||
tmpTypes.Add(BindToType(asmName, typName));
|
|
||||||
}
|
|
||||||
else if (typ.Contains("Generic"))
|
|
||||||
{
|
|
||||||
genType = BindToType(assemblyName, typ);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (genType != null && tmpTypes.Count > 0)
|
|
||||||
{
|
|
||||||
return genType.MakeGenericType(tmpTypes.ToArray());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
string toAssemblyName = assemblyName.Split(',')[0];
|
|
||||||
Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
|
|
||||||
|
|
||||||
foreach (Assembly a in assemblies)
|
|
||||||
{
|
|
||||||
if (a.FullName.Split(',')[0] == toAssemblyName)
|
|
||||||
{
|
|
||||||
typeToDeserialize = a.GetType(typeName);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
cache.Add(assemblyName + typeName, typeToDeserialize);
|
|
||||||
|
|
||||||
return typeToDeserialize;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum ObjType : byte
|
public enum ObjType : byte
|
||||||
|
@ -4,9 +4,6 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Runtime.Serialization;
|
|
||||||
using System.Runtime.Serialization.Formatters;
|
|
||||||
using System.Runtime.Serialization.Formatters.Binary;
|
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
|
||||||
// ReSharper disable ConditionIsAlwaysTrueOrFalse (we're allowing nulls to be passed to the writer where the underlying class doesn't).
|
// ReSharper disable ConditionIsAlwaysTrueOrFalse (we're allowing nulls to be passed to the writer where the underlying class doesn't).
|
||||||
@ -218,25 +215,11 @@ namespace osu.Game.IO.Legacy
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
Write((byte)ObjType.otherType);
|
throw new IOException("Serialization of arbitrary type is not supported.");
|
||||||
BinaryFormatter b = new BinaryFormatter
|
|
||||||
{
|
|
||||||
// AssemblyFormat = FormatterAssemblyStyle.Simple,
|
|
||||||
TypeFormat = FormatterTypeStyle.TypesWhenNeeded
|
|
||||||
};
|
|
||||||
b.Serialize(BaseStream, obj);
|
|
||||||
break;
|
|
||||||
} // switch
|
} // switch
|
||||||
} // if obj==null
|
} // if obj==null
|
||||||
} // WriteObject
|
} // WriteObject
|
||||||
|
|
||||||
/// <summary> Adds the SerializationWriter buffer to the SerializationInfo at the end of GetObjectData(). </summary>
|
|
||||||
public void AddToInfo(SerializationInfo info)
|
|
||||||
{
|
|
||||||
byte[] b = ((MemoryStream)BaseStream).ToArray();
|
|
||||||
info.AddValue("X", b, typeof(byte[]));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void WriteRawBytes(byte[] b)
|
public void WriteRawBytes(byte[] b)
|
||||||
{
|
{
|
||||||
base.Write(b);
|
base.Write(b);
|
||||||
|
Loading…
Reference in New Issue
Block a user