2009-12-29 9 views
2

현재 이진 serializer를 사용하여 하나 또는 두 개의 기본 클래스에서 .txt 파일로 여러 속성을 읽고 쓰는 응용 프로그램이 있습니다.사람이 읽을 수있는 파일을 저장하는 방법

나는 메모장에 .txt 파일을 연 및이 응용 프로그램에 대한 형식화 된 것 같이 어쨌든 = 나를 위해, 내가 XML을 사용하는 들었어요

하지만 꽤 D

인간의 눈에 매우 읽을 수 없습니다 아니다 대부분의 검색 결과는 지나치게 복잡해 보입니다.

저장하려고하는 데이터의 종류는 단순히 "Person.cs"클래스의 모음이며, 이름과 주소, 모든 개인 문자열이지만 속성이 있고 Serializable로 표시된 것입니다.

사람이 쉽게 읽을 수있는 방식으로 실제로 데이터를 저장하는 가장 좋은 방법은 무엇입니까? 또한 응용 프로그램의 데이터를로드하고 변경하고 저장하는 대신 파일에서 직접 작은 변경을하는 것이 더 쉽습니다.

편집 :

내가, 내가 저장하고 내 데이터를로드하고 현재의 방법을 추가 한이 제안하고 nUSER 님/nMember는 정수로 내 _userCollection입니다.

#region I/O Operations 

    public bool SaveData() 
    { 
     try 
     { 
      //Open the stream using the Data.txt file 
      using (Stream stream = File.Open("Data.txt", FileMode.Create)) 
      { 
       //Create a new formatter 
       BinaryFormatter bin = new BinaryFormatter(); 
       //Copy data in collection to the file specified earlier 
       bin.Serialize(stream, _userCollection); 
       bin.Serialize(stream, nMember); 
       bin.Serialize(stream, nUser); 
       //Close stream to release any resources used 
       stream.Close(); 
      } 
      return true; 
     } 
     catch (IOException ex) 
     { 
      throw new ArgumentException(ex.ToString()); 
     } 
    } 

    public bool LoadData() 
    { 
     //Check if file exsists, otherwise skip 
     if (File.Exists("Data.txt")) 
     { 
      try 
      { 
       using (Stream stream = File.Open("Data.txt", FileMode.Open)) 
       { 
        BinaryFormatter bin = new BinaryFormatter(); 

        //Copy data back into collection fields 
        _userCollection = (List<User>)bin.Deserialize(stream); 
        nMember = (int)bin.Deserialize(stream); 
        nUser = (int)bin.Deserialize(stream); 
        stream.Close(); 

        //Sort data to ensure it is ordered correctly after being loaded 
        _userCollection.Sort(); 
        return true; 

       } 
      } 
      catch (IOException ex) 
      { 
       throw new ArgumentException(ex.ToString()); 
      } 
     } 
     else 
     { 
      //Console.WriteLine present for testing purposes 
      Console.WriteLine("\nLoad failed, Data.txt not found"); 
      return false; 
     } 
    } 

답변

6

BinaryFormatter를 XMLSerializer로 바꾸고 똑같은 코드를 실행하십시오.

XmlSerializer serializer = new XmlSerializer(typeof(Person)); 
+0

XmlSerializer에는 BinaryFormatter와 비교하여 여러 가지 제한 사항이 있습니다. 예를 들어 개인 데이터를 직렬화 할 수 없습니다. –

+0

DataContractSerializer는 재미 있지만, 개인적으로 XMLSerializer의 사용법은 성격과 특성이 동일하지 않기 때문에 BinaryFormatter에 더 가깝다고 생각합니다. –

+0

토마스는 사실에 더 가깝다고 생각합니다 ... 특히 서비스 팩의 경우 비 속성 유형에 대한 DCS의 기본 동작은 BF와 매우 유사합니다. 물론 BF도 아닌 DCS도 좋은 선택입니다. 바로 이런 이유로! –

3

당신은 생성자 인수로 StreamWriter를 받아 멋진 텍스트 표현을 구문 분석 입력으로 IList<Person> 소요 Write 방법을 가지고 자신의 PersonsWriter을 구현할 수 있습니다.

예를 들어

: XmlSerializer를 사용

public class PersonsWriter : IDisposable 
{ 
    private StreamWriter _wr; 

    public PersonsWriter(IList<Person> persons, StreamWriter writer) 
    { 
     this._wr = writer; 
    } 

    public void Write(IList<Persons> people) { 
     foreach(Person dude in people) 
     { 
      _wr.Write(@"{0} {1}\n{2}\n{3} {4}\n\n", 
       dude.FirstName, 
       dude.LastName, 
       dude.StreetAddress, 
       dude.ZipCode, 
       dude.City); 
     } 
    } 

    public void Dispose() 
    { 
     _wr.Flush(); 
     _wr.Dispose(); 
    } 
} 
+0

좋은 생각인데 현재는 데이터를 저장하는 데 같은 방법을 사용하기 때문에 다른 응용 프로그램에서도 사용할 수 있기를 원합니다. –

0

그것은 객체를 직렬화 DataContractSerializer

을 시도해보십시오

당신이해야 할 유일한 변화는 XmlSerializer를 위해 생성자의 유형을 선언 할 필요가있는 동안 경우 BinaryFormatter가 빈 생성자를 걸립니다 XML 및 Windows 환경에서 인간과 기계 판독 사이 좋은 타협을하려는 경우 CSV 리더 라이터를 작성

+0

나는 * 사용하기 쉬운 부분이라고 주장하고 싶다. –

1

YAML은 구문 분석하기 쉬운 사람이 읽을 수있는 마크 업의 또 다른 옵션입니다.거의 모든 다른 대중적인 언어뿐만 아니라 C#를 위해 유효한 도서관이있다. 다음은 yaml이 어떤 모습인지 보여주는 샘플입니다.

invoice: 34843 
date : 2001-01-23 
bill-to: &id001 
    given : Chris 
    family : Dumars 
    address: 
     lines: | 
      458 Walkman Dr. 
      Suite #292 
     city : Royal Oak 
     state : MI 
     postal : 48046 
0

정말 XML (DataContractSerializer를 살펴보아야합니다.)이라고 생각합니다. 복잡하지 않습니다. 아마도 BinarySerializer를 XMLSerializer로 대체하고 다시 사용할 수도 있습니다.

그래도 그렇게하고 싶지 않은 경우 구분 된 텍스트 파일을 쓸 수 있습니다. 그런 다음 독자적인 독자 메소드를 작성해야합니다 (단, 분할 메소드를 거의 사용할 수 있음).

//Inside the Person class: 
public override string ToString() 
{ 
    List<String> propValues = new List<String>(); 

    // Get the type. 
    Type t = this.GetType(); 

    // Cycle through the properties. 
    foreach (PropertyInfo p in t.GetProperties()) 
    { 
     propValues.add("{0}:={1}", p.Name, p.GetValue(o, null)); 
    } 

    return String.Join(",". propValues.ToArray()) 
} 

using (System.IO.TextWriter tw = new System.IO.StreamWriter("output.txt")) 
{ 
    tw.WriteLine(person.ToString()); 
} 
1

솔직히, 나는 인간으로서, 나는 모든 것을 읽을 수있는 XML을 찾지 못한다. 사실 그것은 인간이 읽을 수 있도록 설계된 것이 아닙니다.

사람이 읽을 수있는 형식이 필요한 경우 빌드해야합니다.

성격에 따라 이름, 성 및 SSN이있는 Person 클래스가 있다고 가정 해보십시오. 파일을 만들고, 처음 50 개의 필드 (내 머리의 임의 번호)에 대한 설명과 함께 3 행을 쓰고 문자 51을 쓰면 값이 시작됩니다. 데이터가 각 행에서 시작, 각 라인 (프로그램에 어떤 곳

First Name-------Stephen 
Last Name -------Wrighton 
SSN -------------XXX-XX-XXXX 

그런 다음, 다시 그것을 읽는 프로그램이 알 것 :

같다고 파일을 생성합니다 3 호선이 SSN 값임을 알 것입니다.)

하지만 인간의 가독성을 높이려면 데이터 이식성을 희생하십시오.

+0

실제로 SGML은 인간이 읽을 수 있도록 설계되었으며, 프로그래밍 방식으로 구문 분석 할 수있는 기능을 유지하므로 자세한 정보를 얻을 수 있습니다. 또한 XML 1.0 권장 사항에 포함되어 있습니다. 'XML 문서는 사람이 읽기 쉽고 합리적으로 명확해야합니다. '발견 : http://www.w3.org/TR/xml/#sec-origin-goals 이것이 아니라면 JSON (또는 이와 유사한 소형 데이터 지향 언어)가 더 나은 선택이 될 것입니다. +1은 "진정한"사람의 가독성으로 이식성이 떨어지는 것을 나타냅니다. –

+1

좋은 지적이지만, IMO는 사람이 읽을 수있는 것과 사람이 읽을 수있는 것 사이에 차이가 있습니다. 사람이 읽을 수있는 형식은 사람이 읽을 수있는 형식으로 해석 할 수 있지만 컴퓨터로 해석 할 필요가 없다는 것을 의미하지만 사람이 읽을 수있는 것은 데이터가 사람이 쉽게 소비 할 수있는 형식으로 저장/표시된다는 것을 의미합니다.완벽한 예를 그만 두지 마십시오. 메모장에서 HTML 파일을 열면 사람이 읽을 수 있지만 FireFox에서 동일한 HTML 파일을 열면 사람이 읽을 수 있습니다. –

관련 문제