& 사용자 지정 serializer를 작성하고 리플렉션을 사용하여 임의의 클래스를 deserialize 할 수 있습니다. Please Check.
다음은 코드 샘플입니다. 물론 리팩토링이 필요합니다. 방금 작동하는지 보여주기 위해 여기에 추가했습니다.
class Program
{
static void Main(string[] args)
{
Container C = new Container();
Console.WriteLine(C.AnObject.R.Next());
Container CopyC = DeepClone(C);
Console.WriteLine(C.AnObject.R.Next());
Console.WriteLine(CopyC.AnObject.R.Next());
}
public static T DeepClone<T>(T obj)
{
using (var ms = new MemoryStream())
{
var formatter = new BinaryFormatter();
formatter.Serialize(ms, obj); //<-- error here
ms.Position = 0;
return (T)formatter.Deserialize(ms);
}
}
}
[Serializable]
public class Container
{
public ObjectType AnObject;
public Container()
{
AnObject = new ObjectType
{
R = new Random()
};
}
}
[Serializable]
public class ObjectType : ISerializable
{
internal Random R;
public ObjectType() { }
protected ObjectType(SerializationInfo info, StreamingContext context)
{
R = new Random();
var binaryFormatter = new BinaryFormatter();
using (var temp = new MemoryStream(Encoding.BigEndianUnicode.GetBytes(info.GetString("_seedArr"))))
{
var arr = (int[])binaryFormatter.Deserialize(temp);
R.GetType().GetField("_seedArray", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).SetValue(R, arr);
}
R.GetType().GetField("_inext", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).SetValue(R, info.GetInt32("_inext"));
R.GetType().GetField("_inextp", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).SetValue(R, info.GetInt32("_inextp"));
}
public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
{
var binaryFormatter = new BinaryFormatter();
var arr = R.GetType().GetField("_seedArray", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
using (var temp = new MemoryStream())
{
binaryFormatter.Serialize(temp, arr.GetValue(R));
info.AddValue("_seedArr", Encoding.BigEndianUnicode.GetString(temp.ToArray()));
}
info.AddValue("_inext", R.GetType().GetField("_inext", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).GetValue(R));
info.AddValue("_inextp", R.GetType().GetField("_inextp", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).GetValue(R));
}
}
내가 (예외가 그나마
는 그런 다음 개체를 복제하는 Json.NET을 사용하는Cloner
클래스를 작성할 수 있습니다. NET 4.6.2) –왜'System.Random'의 자신의 버전을 쓰지 않고 대신 사용 하시겠습니까? PRNG를 쓸 수있는 많은 옵션이 있습니다. 기본 [C# 소스 코드] (https://referencesource.microsoft.com/#mscorlib/system/random.cs)의 관련 부분을 직접 복사 할 수도 있습니다. – rossum
이제 http://referencesource.microsoft.com/#mscorlib/system/random.cs,bb77e610694e64ca 에서 임의의 클래스를 복사했으며 작동하는 것처럼 보였습니다. 일부 Environment.GetResourceString 오류를 주석 처리해야했습니다. 번들로 제공되는 System.Random에서 왜 작동하지 않습니까? – xareth