2014-07-24 1 views
3

C#으로 큰 게임 프로젝트의 저장/불러 오기 시스템을 만들고 있습니다.저장 /로드 시스템의 완전성을 확인하는 방법

저장해야하는 각 클래스는 DoSnapshot() 메서드를 구현합니다.

이 메서드 내에서 프로그래머는 (foo)을 저장해야하는 경우 클래스의 모든 필드에 대한 함수를 호출해야합니다. 그렇지 않으면 Ignore(foo)을 호출하면 안됩니다.

복잡한 유형의 버전뿐만 아니라 DoFloat, DoString과 같은 많은 원시 유형에 대해 DoSnapshot 메소드가 있습니다.

나는 100s 클래스가 있으며 프로젝트는 아직 개발 중입니다.

각 클래스의 모든 입력란이 Snapshot() 또는 Ignore() 전화에서 사용되는 확인을 추가 할 수 있습니까? 필드를 생략하면 버그가 발생합니다. 확인은 런타임 또는 컴파일 타임 일 수 있습니다. 개발 중에 만 사용하려면 사용자에게 공개되지 않습니다.

+0

사용자 정의 FXCop 규칙을 작성 했습니까? http://blogs.msdn.com/b/codeanalysis/archive/2010/03/26/how-to-write-custom-static-code-analysis-rules-and-integrate-them-into-visual-studio- 2010.aspx – JoshBerke

+0

아니요 ... 어쨌든, 우리는 Visual Studio Express 2010을 사용하고 있으며 지원되지 않는다고 생각합니다. –

+0

아니, 정적 코드 분석을 수행하고 사용자 지정 규칙을 추가 할 수있는 다른 도구가 없다고하지 마십시오. 최선의 방법은 기본 DoSnapshot 메소드를 제공하여 개발자가 속성으로 표시하는 것만으로 충분하다고 생각합니다 ... 저장된 모든 객체가 필수로 표시되거나 무시되도록 루틴을 쉽게 작성할 수 있습니다. 그리고 개발자는 dosnapshot 메서드를 구현할 필요가 없습니다 :-) – JoshBerke

답변

1

저장할 필요가있는 필드에 특성을 추가 한 다음 DoSnapshot 메서드에서 클래스의 모든 속성을 반복 할 수 있습니다. 속성에 원하는 속성이 있으면 Snapshot으로 전화하고 그렇지 않으면 Ignore으로 전화하십시오.

public class SomeClass : SomeBaseClass 
{ 
    [Required] 
    public string Foo { get; set; } 
    public string Bar { get; set; } 

    public override void DoSnapshot() 
    { 
     var properties = this.GetType().GetProperties(); 
     foreach (var property in properties) 
     { 
      var isRequired = property.GetCustomAttributes(typeof (RequiredAttribute), false).Length > 0; 
      if (isRequired) 
      { 
       // Something 
      } 
      else 
      { 
       // SomethingElse 
      } 
     } 
    } 
} 
+0

요점은 프로그래머가 무언가를 잊었는지 확인하는 것입니다. 메서드 호출 대신 태그를 사용하면 문제가 이동하는 것처럼 보입니다 ... –

+0

제공된 예제에서 모든 속성을 가져오고 무시 또는 스냅 샷을 호출 할 수 있으므로 모든 필드를 확인하게됩니다. –

+0

알겠습니다. 감사합니다. 태그를 무시해야합니다. 어쨌든 필요한 것은 메소드 호출에 대한 검증입니다. 예제가 단순화되었습니다. doSnapshot - DoFloat, DoString 등 약 30 버전이 있습니다. –

0

여러분이하는 일은 standard .NET serialization/deserialization과 비슷합니다. 귀하의 유형을 조사해 보셨습니까 [Serializable]/ISerializable?

기본적으로 직렬화 될 내용과 그렇지 않을 내용을 정의하는 특정 규칙이 있습니다. 즉, 유형의 각 속성 및 필드에 대해 수동으로 생각하는 대신 예외에 대해서만 생각하면됩니다. 즉 이러한 표준 규칙에서 벗어나는 특성 및 필드.

(예를 들어, Snapshot()에 이러한 속성/닷넷 시리얼 어쨌든 기본적으로 직렬화 선택할 것 필드를하지 않았을 경우에만 예외를 지정해야 할 것 :. 귀하의 Ignore 가능성이 [NonSerialized]로 대체 될 수 있습니다.)


PS : 당신이 코멘트에서 국가로, 이미 대신 .NET 직렬화의 자신의 메커니즘을 결정했다. 그럼에도 불구하고 직렬화에서 아이디어 하나를 얻는 데는 너무 늦지 않았습니다. convention over configuration.

즉, 모든 속성/입력란 또는 비정상적인 경우, 즉 일부 고정 된 사전 정의 된 규칙에서 벗어나는 속성 만 처리해야합니까? 전자는 코드에 대해 System.Reflection 등 전체 범위를 체계적으로 확인하는 것이 더 쉽습니다. 후자는 잠재적으로 많은 작업을 절약하고 예외를보다 분명하게 나타냅니다.

+0

감사합니다. 고려했지만 설계가 완료되었습니다. –

+0

@ user1919998 : 추기경을 추가했습니다. 내 대답에. 위 참조. – stakx

+0

대부분 직렬화해서는 안되는 필드는 다른 객체에 대한 참조, 참조 컬렉션, 타임 슬라이스 된 계산 또는 스크래치 패드 필드에 사용되는 필드입니다. –

0

내가 할 일은 속성을 만들고 각 필드를 저장해야하는지 여부를 "태그 지정"하는 것입니다. 그런 다음 런타임에 리플렉션을 사용하여 클래스를 쿼리하여 일련 화해야하는 모든 필드를 가져옵니다.

public class RandomClass 
{ 
    public string Foo { get; set; } 
    [Ignore] 
    public int Bar { get; set; } 
} 

public class IgnoreAttribute : Attribute 
{ 

} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var properties = typeof(RandomClass).GetProperties() 
         .Where(prop => !prop.IsDefined(typeof(IgnoreAttribute), false)); 
     // Serialize all values 
    } 
} 
관련 문제