2016-06-24 2 views
0

지금은 직렬화하고 디스크에 저장하려는 여러 클래스가 있습니다. 형식은 중요하지 않습니다. 그러나 실제로 저장할 필요가있는 것은 각각의 선택 필드입니다. 이 필드는 클래스에 따라 다르지만 모두 공개입니다. 내 접근임의의 클래스 저장 및 직렬화

public class A { 
    public string stringField; 
    public int intField; 
    ... 
} 

public class B { 
    public float floatField; 
    public Object objectField; 
    ... 
} 

저장하고이 분야를 직렬화뿐만 아니라 각 클래스에 대한 저장 public 필드와 클래스의 인스턴스를 반환하도록로드 할 수있는 간단한 컨테이너 클래스를 가지고 있었다.

저장하려는 클래스의 필드와 일치하는 필드를 가진 클래스를 만들어서이 작업을 수행 할 수 있습니다.

public class AStorage{ 
    public string stringFieldStorage; 
    public int intFieldStorage; 
    ... 

    public void StoreA(A a){ 
     stringFieldStorage = a.stringField; 
     intFieldStorage = a.intField; 
    }  

    public A GetA(){ 
     A a = new A(); 
     a.stringField = stringFieldStorage; 
     a.intField = intFieldStorage; 
     return a; 
    } 
} 

이 작동하지만 내가 수업을 많이 필요로하고 내가 그들에게 자신이 저장하고있는 클래스에서 수신 할 내용에 따라 필드를 제공 할 필요가 있다는 것을 의미합니다.

저는 리플렉션을 사용하여 필드와 이름을 파악하는 방법을 살펴 보았습니다. 그런 다음 필드 이름으로 입력 한 Dictonary<string, Object>에 입력 한 다음 참조 할 수 있습니다. 그러나, 그것은 나에게 조금 칙칙한 느낌과 내가 잘못한 일을하고 있는지 궁금해하고있다. 클래스를 저장하고 직렬화하는 데 실제로 시도한 방법은 무엇입니까?

답변

1

많은 시리얼 라이저는 selective serialization을 지원합니다. 예를 들어 NotSerializedAttribute (예 : 바이너리 시리얼 라이저)로 직렬화하면 안되는 속성을 표시하거나 직렬화에 명시 적으로 옵트 아웃해야하는 속성을 필요로합니다. DataContractSerializer의 DataMemberAttribute입니다.

두 가지 방법 중 하나를 사용하면 저장소 용으로 별도의 클래스를 만들 필요가 없으며 .NET Framework에서 완전히 지원됩니다.

0

일부 futzing 후 나는 리플렉션을 사용하여 이름으로 필드를 간단히 일치 시키기로 결정했습니다. 이렇게하면 스토리지 클래스에 저장하려는 필드를 만들면됩니다. 또한 수동 할당을 할 필요가 없으므로 프로젝트 규모가 상당히 유지 될 것으로 보입니다. 여기에 두 가지 방법이 있습니다.

public void Store(Object source){ 
    var thisType = this.GetType(); 
    var sourceFields = source.GetType().GetFields (flags); 
    foreach (var field in sourceFields) { //get all properties via reflection 
     var instanceField = thisType.GetField (field.Name); 
     if(instanceField != null){ //check if this instance has the source's property 
      var value = field.GetValue(source); //get the value from the object 
      if(value != null){ 
       instanceField.SetValue(this, value); //put it into this instance 
      } 
     } 
    } 
} 

public T LoadIntoObject<T> (T target){ 
    var targetFields = target.GetType().GetFields(); 
    foreach (var field in targetFields) { 
     var instanceField = this.GetType().GetField (field.Name); 
     if(instanceField != null){ //check if this instance has the targets's property 
      var value = instanceField.GetValue(this); 
      if(value != null){ 
       field.SetValue(target, value); //put it into the target 
      } 
     } 
    } 
    return target; 
} 
+0

직렬화는 .NET Framework에서 잘 해결되는 문제입니다. 왜 자신 만의 솔루션을 만들고 싶습니까? –