2011-02-03 2 views
4

저는 딜레마에 빠졌습니다. 내 C# 응용 프로그램은 텍스트 편집기에서 사람이 편집 할 수있는 사용자 지정 파일 형식을 사용하지만 내 응용 프로그램의 GUI를 통해 편집 할 수도 있습니다. 이 파일은 최상위 수준의 개체 (최상위 개체라고 함)를 나타내며 여러 개의 작은 개체가 들어 있으며 다른 개체도 포함됩니다. 이 오브젝트에 포함 된 모든 데이터가 파일에 제공됩니다.직렬화와 문법 분석을 결합하는 방법은 무엇입니까?

로드/저장 문제를 해결하는 방법에 대해 고민하고 있습니다. 인간 편집 가능성 (바이너리 직렬화)을 깨거나 기본 클래스 (XML 및 DataContract 직렬화)의 직렬화 컬렉션에 "문제점"이 있기 때문에 C# 직렬화가 작동하지 않습니다. 기본 클래스를 직렬화 할 때 파생 클래스의 명확성을 위해 텍스트를 추가합니다. 파일을 사람이 편집하기에 더 취약하게 만듭니다.); 손으로 파일을 편집 할 필요가 없다면 티켓이었을 것입니다. GOLD 및 GPLEX/GPPG와 같은 파서 생성기를 사용하여 파일을 구문 분석하고 표현한 객체로 변환했는데 유망 해 보였습니다. 그러나 파일로드의 한 방향만을 다루고 있습니다. 그 (것)들을 쓸 때 정확한 형식.
1) 특정 구조의 파일 읽기와 TopObject와 모든 포함 된 개체로 변환하고
2)을 감안할 때 : 좋은 것 무엇

모두 처리하는 문법을 지정하는 방법이 될 것입니다 TopObject, 동일한 구조를 가진 파일에 상태를 기록합니다.
출력 구조를 적용 할뿐만 아니라 가져 오기 구조를 시행하는 단일 문법.

나를 도울 수있는 도구 나 프레임 워크가 있습니까? 이게 가능한 일인가요, 아니면 제가 너무 과도하게 지나치게 생각하고 있습니까? 더 쉬운 방법이 있습니까?

답변

4

XML을 사용하지만 사용자 고유의 직렬 변환기를 작성하십시오. 이 사람이 읽을 수있는 정도를 고려하는 경우

<TopObject> 
    <SubObject> 
     <SubObject> 
      etc. 
     </SubObject> 
     <SubObject> 
      etc. 
     </SubObject> 
    </SubObject> 
    <SubObject></SubObject> 
</TopObject> 

나도 몰라,하지만 물건 닷넷 시리얼이 더 낫다 : 당신은 간단한 XML 형식을 만들 .NET의 XML 리더/라이터 클래스를 사용할 수 있습니다 만듭니다. 재귀 적으로 읽기/쓰기가 쉬울 것입니다.

예 : 여기

당신이 적용 할 수있는 간단한 예입니다. 나는이 클래스를 가지고 가정 :

public class Node { 
    public Node(String _SomeProperty) { 
     this.SomeProperty = _SomeProperty; 
    } 

    public String SomeProperty; 

    public List<Node> Children = new List<Node>(); 
} 

NodeSomeProperty라는 속성이 있습니다. 그것은 또한 아이들을 가질 수 있습니다. Children 속성의 Nodes입니다. 여기

는 직렬화하는이 클래스에서 일부 데이터를 생성하는 콘솔 응용 프로그램에서 main :

private static void RecursivelySerialize(ref XmlWriter writer, Node sc) { 
    writer.WriteStartElement("Node"); 

    writer.WriteElementString("SomeProperty", sc.SomeProperty); 

    if (sc.Children.Count > 0) { 
     writer.WriteStartElement("Nodes"); 

     foreach (Node scChild in sc.Children) 
      RecursivelySerialize(ref writer, scChild); 

     writer.WriteEndElement(); 
    } 

    writer.WriteEndElement(); 
} 

: 그것은 그 실제 작업을 수행 RecursivelySerialize라는 방법, 호출

static void Main(string[] args) { 
    // Make some data for testing 
    Node baseObject = new Node("This is the base class"); 

    List<Node> Children = new List<Node>(){ 
     new Node("This is a child"), 
     new Node("This is another child") 
    }; 

    baseObject.Children = Children; 

    Node aSubChild = new Node("This is a child of a child"); 
    baseObject.Children[0].Children = new List<Node>() { aSubChild }; 

    // Serialize 

    XmlWriter writer = XmlWriter.Create("test.xml"); 

    writer.WriteStartDocument(); 


    RecursivelySerialize(ref writer, baseObject); 
    writer.Flush(); 
} 

이 방법은 복잡하지 않습니다. 이를 개선하기 위해 Reflection을 사용하여 모든 유형의 클래스를 동적으로 직렬화 할 수 있습니다.위의 코드를 실행하는 경우 여기에 내가 가진 출력 (잘 포맷)되어

<?xml version="1.0" encoding="utf-8"?> 
<Node> 
    <SomeProperty>This is the base class</SomeProperty> 
    <Nodes> 
     <Node> 
      <SomeProperty>This is a child</SomeProperty> 
       <Nodes> 
        <Node> 
         <SomeProperty>This is a child of a child</SomeProperty> 
        </Node> 
       </Nodes> 
     </Node> 
     <Node> 
      <SomeProperty>This is another child</SomeProperty> 
     </Node> 
    </Nodes> 
</Node> 
+0

@SimpleCoder, 사용자 정의 시리얼 라이저의 간단한 예를 들려 줄 수 있습니까? –

+1

@ Justin : 물론, 잠깐만 ... –

+0

@SimpleCoder Thanks! –

1

개인적으로, 나는 비 기술적 인 인간이 적어도 편집 할 수없는 파일 인간 - 편집을 만들기에 너무 연연하지 않을 것입니다. 응용 프로그램에서 파일을 소비해야하는 경우 정확성이 필요하며 사용자가 설정 한 문법에 관계없이 사람은 여전히이 잘못됩니다.

XML/JSON/INI는 일부 기술자가 (놀랍게도) 엉망이되지는 않지만 여전히 일부 기술자에게는 친숙합니다. 나는 이것이 당신 자신의 문법을 구사하는 것보다 더 나은 선택이라고 생각합니다. 파일을보다 사용자 친화적으로 편집하고 싶다면 "인간이 편집 가능한"요구 사항을 삭제하고 응용 프로그램에서만 편집 할 수 있도록 할 수 있습니다.

관련 문제