2016-08-17 13 views
1

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] 필드 속성을 가진 개인 변수를 직렬화 할 수있는 방법

?

감사합니다.

+1

"버전 관리를 지원합니다."글쎄, 미래에 버전 문제가있을 것으로 생각하십니까? 이진 직렬화는 * 전송 * 메커니즘, 다른 응용 프로그램 (같은 버전의 응용 프로그램) 또는 다른 응용 프로그램의 응용 프로그램 간 또는 유사한 응용 프로그램간에 사용됩니다. ** 저장 메커니즘 *이 아닙니다 **입니다. –

+1

클래스에'[Serializable]'속성을 붙이고 기본 동작에 의존하는 이유는 무엇입니까? 그런데 BinaryFormatter는 최악의 직렬화 방법 중 하나입니다. 버전 문제를 피하려면 다른 방법을 시도해 보는 것이 좋습니다. –

+0

BinaryFormatter는 비공개 필드를 serialize하지 않습니다. A에서 개인 회원을 매핑하려는 노력은 B의 개인 회원을 매핑하는데도 미치지 않습니다. 지금하고있는 일은 딥 카피에서 흔히 경험하게되는 문제에 취약합니다. 당신은 어려운 길을하고 있습니다. – Biscuits

답변

0

나는 이것을 해결했다.

이제 직렬 변환기가 올바르게 작동합니다. 멀리 솔루션으로 간다 문제는 deserialization, 개인 필드를 무시한 공용 필드를 deserializing했다.

내가 염두에두고 있던 버전 관리는 필드 추가 또는 제거에 대한 것이 었습니다. 이전 저장으로 게임을로드 중입니다. 그러나이 또한 serializer로 처리됩니다.