BinaryFormatter로 게임 저장을 직렬화 및 비 직렬화하려고합니다. 이 유틸리티 메서드를 사용하기 때문에 ISerializable 인터페이스를 사용하지 않고 각 필드에 대해 Versioning을 지원하기 위해 AddValue()를 수동으로 작성할 필요가 없습니다.BinaryFormater를 사용하여 직렬화 - C#
public void Serialize(object obj, string path)
{
FieldInfo[] fieldsPublic = obj.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance);
FieldInfo[] fieldsPrivate = obj.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
foreach (FieldInfo info in fieldsPublic)
{
object valiue = info.GetValue(obj);
if(!info.IsDefined(typeof(NonSerializedAttribute), true))
fields.Add(info, info.GetValue(obj));
}
foreach (FieldInfo info in fieldsPrivate)
{
if (info.IsDefined(typeof(SerializeField), true))
fields.Add(info, info.GetValue(obj));
}
BinaryFormatter bf = new BinaryFormatter();
FileStream file = File.Create(path);
bf.AssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple;
bf.Serialize(file, fields);
file.Close();
}
이제이 문제를 직렬화 할 때 fieldsPublic 필드에는 public 멤버 만 포함됩니다. 또한 [SerializeField] 특성을 가진 전용 멤버를 포함하려고합니다. 그러나이 속성은 객체의 첫 번째 레벨에서만이 속성을 가진 필드를 검사하기 때문에 무시됩니다.
예, I 클래스에게 객체를 직렬화 할 때 :
class A
{
public B b;
[SerializeField]
private int value; // This is NOT ignored
}
class B
{
[SerializeField]
private int value; // This is ignored
}
나는 또한 그것이 [SerializeField] 필드 속성을 가진 개인 변수를 직렬화 할 수있는 방법
?
감사합니다.
"버전 관리를 지원합니다."글쎄, 미래에 버전 문제가있을 것으로 생각하십니까? 이진 직렬화는 * 전송 * 메커니즘, 다른 응용 프로그램 (같은 버전의 응용 프로그램) 또는 다른 응용 프로그램의 응용 프로그램 간 또는 유사한 응용 프로그램간에 사용됩니다. ** 저장 메커니즘 *이 아닙니다 **입니다. –
클래스에'[Serializable]'속성을 붙이고 기본 동작에 의존하는 이유는 무엇입니까? 그런데 BinaryFormatter는 최악의 직렬화 방법 중 하나입니다. 버전 문제를 피하려면 다른 방법을 시도해 보는 것이 좋습니다. –
BinaryFormatter는 비공개 필드를 serialize하지 않습니다. A에서 개인 회원을 매핑하려는 노력은 B의 개인 회원을 매핑하는데도 미치지 않습니다. 지금하고있는 일은 딥 카피에서 흔히 경험하게되는 문제에 취약합니다. 당신은 어려운 길을하고 있습니다. – Biscuits