2009-07-30 7 views
0

에 속성 나는 다음과 같은 XML은 니펫을했다 : 내가 좋아하는 것이 무엇직렬화 강한 type 속성

<Configuration> 
    <Config name="SendToAddresses"></Config> 
    <Config name="CCToAddresses"></Config> 
    <Config name="BCCAddresses"></Config> 
</Configuration> 

값 쌍을 포함하는 배열 설정의 모든 항목 (이름, 강력한 형식의 클래스에 직렬화하는 것입니다 | 값).

답변

4
class Program 
{ 
    static void Main(string[] args) 
    { 
     XmlSerializer serializer = new XmlSerializer(typeof(Configuration)); 
     var xml = 
@"<Configuration> 
    <Config name=""SendToAddresses"">some value</Config> 
    <Config name=""CCToAddresses""></Config> 
    <Config name=""BCCAddresses""></Config> 
    </Configuration>"; 
     using (var reader = new StringReader(xml)) 
     { 
      var configuration = (Configuration)serializer.Deserialize(reader); 
     } 
    } 
} 

public class Configuration 
{ 
    [XmlElement(ElementName="Config")] 
    public Config[] Configs { get; set; } 

} 

public class Config 
{ 
    [XmlAttribute(AttributeName = "name")] 
    public string Name { get; set; } 

    [XmlText] 
    public string Value { get; set; } 
} 
0

강력한 유형을 얻으려면 각 XML 노드의 정의와 유형을 포함하는 XSD 파일 인 XML 스키마를 만들어야합니다. 이것에 대해 MSDN documentation을 확인하십시오. 구성의 배열을 가지고 강력한 형식의 객체로 XML 파일을 역 직렬화 할 점은 없습니다

[XmlRoot("Configuration")] 
    public class Configuration 
    { 
     [XmlElement("Config")] 
     public List<Config> Configs { get; set; } 
    } 

    public class Config 
    { 
     [XmlAttribute("name")] 
     public string Name { get; set; } 
     [XmlText] 
     public string Value { get; set; } 

     public Config() { } 
    } 

    // ... 

    XmlSerializer s = new XmlSerializer(typeof(Configuration)); 
    Configuration conf = (Configuration)s.Deserialize(new StringReader("INSERTXMLHERE")); 

    foreach (var config in conf.Configs) 
    { 
     Console.WriteLine("{0} = {1}", config.Name, config.Value); 
    } 
+0

감사합니다,하지만하지 무슨 뜻 이잖아. 내가 원하는 것은 C# 클래스로 deSerialize하는 것이지만, 단지 Config의 콜렉션을 갖는 대신에, 어떻게 든 요소에 대한 name 속성을 가져야 만한다. –

+0

아마도 도움이 될 수도 있습니다. http://stackoverflow.com/questions/1081325/c-how-to-xml-deserialize-object-itself 다시 말해서 올바르게 수행하려면 스키마를 사용하십시오. – Sorantis

0

은 당신을 위해 무엇을 찾고이입니다.

<Configuration> 
    <SendToAddresses></SendToAddresses> 
    <CCToAddresses></CCToAddresses> 
    <BCCAddresses></BCCAddresses> 
</Configuration> 

그리고 아래의 간단한 단계를 따르십시오 : 당신이 당신의 XML 파일을 변경할 줄 수있는 경우에

  1. 첫째, 당신은으로 개체를 직렬화하는 컨테이너 (객체)가 필요합니다 .
  2. 또한 XSD.exe를 사용하여 파일을 생성합니다 (XSD 스키마와 XSD 스키마의 CS 파일).

XSD.exe를 사용하면 15 분 내에 설정되고 강력한 유형화 된 구성 개체가 설정됩니다.

0

당신이 해결하려고 시도하는 문제가 이미 System.Configuration 네임 스페이스에서 해결되었다고 생각합니까?

Jon Rista의 Code Project this article은 Configuration 클래스를 사용하는 방법에 대한 개요를 제공하며 사용자가 원하는 것을 성취하는 데 도움이 될 것이라고 생각합니다.

이것이 정확히 필요하지 않은 경우 프로젝트의 직렬화 어셈블리를 만들면 구성 클래스가 포함 된 어셈블리를 만들 수 있습니다.

컴파일하는 동안 deserializer 및 serializer 클래스를 만들지 않았을 때마다 deserialization 및 serialization 문제가 발생했습니다. 시간이 지나면 런타임 중에 생성되는 XmlSerialization 클래스가 항상 생성되거나 사용 가능한 것은 아니므로 오류가 발생할 수 있습니다.

가장 쉬운 방법은 새 어셈블리 프로젝트를 만들고 공용 읽기/쓰기 속성이있는 Serializeable() 클래스를 추가하는 것입니다. 그런 다음

sgen/A ... 그래서 같은 포스트 빌드 이벤트에 시리얼 어셈블리를 생성 sgen을 사용할 수 있습니다 : $ (TargetFileName)/힘 그리고/자세한

당신이 당신의 직렬화 어셈블리를 참조해야합니다 AssemblyName.Serializable.Serializers가 bin 또는 probing 경로에서 사용 가능한 한 런타임에서 동적 어셈블리가 만들어지지 않고 오류가 발생하지 않을 것입니다.

일단 완료되면 직렬화 어셈블리에 포함 된 유형을 직렬화 및 비 직렬화 할 수 있습니다.

일렬 ....

IsolatedStorageFile isolatedStorage = IsolatedStorageFile.GetUserStoreForAssembly(); 
using (IsolatedStorageFileStream stream = new 
    IsolatedStorageFileStream(key, FileMode.Create, isolatedStorage)) 
{ 
    XmlSerializer serializer = new XmlSerializer(typeof(T)); 
    serializer.Serialize(stream, value); 
} 

직렬화 복원

using (IsolatedStorageFile isolatedStorage = 
    IsolatedStorageFile.GetUserStoreForAssembly()) 
{ 
    using (IsolatedStorageFileStream stream = 
     new IsolatedStorageFileStream(
     key, FileMode.OpenOrCreate, FileAccess.ReadWrite, isolatedStorage)) 
    { 
     if (stream.Length > 0) 
     { 
      XmlSerializer serializer = new XmlSerializer(typeof(T)); 
      return (T)serializer.Deserialize(stream); 
     } 
     else 
     { 
      return default(T); 
     } 

    } 
} 
관련 문제