2009-02-02 3 views
0

내 응용 프로그램은 객체를 나타내는 문자열을받습니다. 내가 만들고있는 객체의 속성 값을 얻기 위해 문자열을 구문 분석해야합니다. 각 객체는 얼마나 많은 속성이 있는지, 각 속성이 의미하는 것 등의 세부 사항을 알아야합니다. 그러나 각 클래스가 문자열을 구문 분석하는 방법을 알지 않도록하고 싶습니다. 차라리 각각의 개별 객체에 더 적합한 데이터 구조 (예 : 데이터 집합 또는 XML)를 전달할 수 있습니다. 속성을 채우기가 더 쉬운 것입니다.이 문자열 데이터를 어떻게 직렬화해야합니까?

이러한 유형의 .NET 프레임 워크에 적합한 것이 있습니까? 아니면 내 컨테이너 객체를 만들어야하나요?

ADD :

내가 처음에 내 질문에 충분히 설명 생각하지 않습니다. 다음은 명확히하는 예입니다.

내 프로그램이 항상 위키 구문의 데이터 테이블을 나타내는 문자열로 전달된다고 가정 해 봅니다. 뭔가 같은 :

{||Client:||ABC|-|Contact:||Joe Smith|-|Current revision:||1.0||} 

내가 구문 분석하는 방법을 알고 내 특정 위키 테이블 오브젝트의 각 하나 (예를 들어, ClientContactTable, CustomerOrderTable 등)을하지 않으 | - 및}. 그래서 각 특정 Wiki 테이블 객체의 생성자에 전달할 수있는 "중간"티어 객체로 문자열을 구문 분석하는 코드 1 덩어리를 작성하고 싶습니다.

내 질문 : 중간 계층 개체는 무엇이되어야합니까?

답변

3

내가 잘못 질문을 이해 할 수 있지만 표준 .NET 직렬화가 사용자의 요구에 맞는 생각 :

var ms = new MemoryStream(); 
var formatter = new BinaryFormatter(); 
formatter.Serialize(ms, myObject); 

// Deserialization: 
var deserialized = (MyClass)formatter.Deserialize(stream); 
+0

List 속성의 내용은 무엇입니까? – Kiquenet

0

을 문자열 데이터를 구문 분석하고 그것을 개체 또는 xml로 변환해야합니다. string.split을 사용하는 것이 좋습니다. 컬렉션 (배열)을 만든 다음 linq를 사용하여 원하는 데이터 구조를 만들고 데이터 구조와 함께 facotry에 전달하는 param을 기반으로 올바른 객체를 반환하는 팩토리에 전달합니다.

1

전통적인 방법은 System.Xml.Serialization 클래스를 사용하는 것입니다. 이렇게하면 객체를 디스크에 직렬화하고 나중에 객체를 비 직렬화 할 수 있습니다. 여기에는 몇 가지 제한이 있습니다. 유형은 public이어야하며 매개 변수없는 public 생성자가 있어야하며 XmlSerializer 특성이 있어야합니다.

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Text; 
using System.Xml.Serialization; 


namespace ConsoleApplication1 
{ 
    [Serializable] 
    public class Cat 
    { 
     DateTime _dateOfBirth; 
     string _name; 

     public DateTime DateOfBirth 
     { 
      get { return _dateOfBirth; } 
      set { _dateOfBirth = value; } 
     } 

     public string Name 
     { 
      get { return _name; } 
      set { _name = value; } 
     } 

     public Cat() : this(DateTime.Now, "(Cat with no name)") { } 

     public Cat(DateTime dateOfBirth, string name) 
     { 
      this.DateOfBirth = dateOfBirth; 
      this.Name = name; 
     } 

     public override string ToString() 
     { 
      return string.Format("Name: {0}, DateOfBirth: {1}", Name, DateOfBirth); 
     } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      Cat originalCat = new Cat(DateTime.Now, "Fluffy"); 
      XmlSerializer serializer = new XmlSerializer(typeof(Cat)); 

      MemoryStream memStream = new MemoryStream(); // can be file stream 
      serializer.Serialize(memStream, originalCat); 

      memStream.Position = 0; // this is just here to make this code sample work, usually you 
            // you don't need to set your streams position manually 

      Cat deserializedCat = (Cat)serializer.Deserialize(memStream); 

      Console.WriteLine("originalCat.ToString(): {0}", originalCat.ToString()); 
      Console.WriteLine("deserializedCat.ToString(): {0}", deserializedCat.ToString()); 

      Console.ReadKey(true); 
     } 
    } 
} 

일반적으로 직렬화 이런 종류의 매우주의 해야한다. 동일한 어셈블리의 다른 버전간에 객체를 직렬화/비 직렬화하려고하면 기이 한 일이 발생합니다.

추가 편집 : 위의 코드는 개체를 XML로 serialize합니다. 대신 MemoryString을 StringWriter로 대체하여 XML 표현을 볼 수 있습니다 (stringWriterInstance.ToString() 메서드를 호출하여 XML 문자열 직접 가져 오기).다른 사람들은 BinaryFormatter를 사용하는 것을 제안했지만, BinaryFormatter는 다소 차이는 있지만 출력은 텍스트가 아닌 바이너리입니다.

두 가지 방법 모두 데이터를 직렬화하는 데 유효한 방법이며 XML 또는 이진 데이터를 더 많이 사용하는지 여부에 달려 있습니다.

0

개체를 저장해야하는 경우 XmlSerializer를 사용해야합니다. 이것은 객체를 XML로 직렬화/직렬화하여 구문 분석합니다.

public List<_type> LoadDataFromResource<_type>(string file) 
{ 
    List<_type> data = new List<_type>(); 
    FileStream str = File.OpenRead(file); 
    if (str == null) return null; 
    XmlSerializer sr = new XmlSerializer(data.GetType()); 
    if (sr == null) return null; 
    data = sr.Deserialize(str) as List<_type>; 
    return data; 
} 

public bool SaveData<_type>(string file, List<_type> data) 
{ 
StreamWriter writer = File.CreateText(file); 
if (writer == null) return false; 
XmlSerializer sr = new XmlSerializer(data.GetType()); 
if (sr == null) return false; 
sr.Serialize(writer, data); 
return true; 
} 
관련 문제