2014-07-18 3 views
0

일부 C# 필드를 XML 파일로 직렬화하는 데 문제가 있습니다. 아래 코드 나는이되어 여러 정보와 시설 목록이있을 수XML 목록 직렬화 (및 직렬화 해제)

<?xml version="1.0" encoding="Windows-1252"?> 
<Config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Username>admin</Name> 
    <Password>123456</VoiceServer> 
    <Facilities> 
    <Facility> 
     <ID>1</ID> 
     <Name>First Facility</Name> 
     <Profiles> 
     <Profile> 
      <SomeItem>Value</SomeItem> 
      <AnotherItem>Value</AnotherItem> 
     </Profile> 
     <Profile> 
      <SomeItem>Value</SomeItem> 
      <AnotherItem>Value</AnotherItem> 
     </Profile> 
     <Profile> 
      <SomeItem>Value</SomeItem> 
      <AnotherItem>Value</AnotherItem> 
     </Profile> 
     </Profiles> 
    </Facility> 
    <Facility> 
     <ID>2</ID> 
     <Name>Second Facility</Name> 
     <Profiles> 
     <Profile> 
      <SomeItem>Value</SomeItem> 
      <AnotherItem>Value</AnotherItem> 
     </Profile> 
     <Profile> 
      <SomeItem>Value</SomeItem> 
      <AnotherItem>Value</AnotherItem> 
     </Profile> 
     <Profile> 
      <SomeItem>Value</SomeItem> 
      <AnotherItem>Value</AnotherItem> 
     </Profile> 
     </Profiles> 
    </Facility> 
    </Facilities> 
</Config> 

주의 사항 :

public class Facility 
{ 
    public string ID = ""; 
    public string Name = ""; 

    public List<Profile> Profiles { get; set; } 
} 

public class PrefSet 
{ 
    public string SomeItem = ""; 
    public string AnotherItem = ""; 
} 

public class Config 
{ 
    public string Username = ""; 
    public string Password = ""; 

    public List<Facility> Facilities { get; set; } 

    public static void SerializeObjectToFile<T>(T dataToSerialize, string filePath) 
    { 
     try 
     { 
      using (Stream stream = File.Open(filePath, FileMode.Create, FileAccess.ReadWrite)) 
      { 
       XmlSerializer serializer = new XmlSerializer(typeof(T)); 
       XmlTextWriter writer = new XmlTextWriter(stream, Encoding.Default); 
       writer.Formatting = Formatting.Indented; 
       serializer.Serialize(writer, dataToSerialize); 
       writer.Close(); 
      } 
     } 
     catch 
     { 
      File.Create(filePath); 
     } 
    } 

    public static T DeserializeObjectFromFile<T>(string filePath) 
    { 
     try 
     { 
      XmlSerializer serializer = new XmlSerializer(typeof(T)); 
      T serializedData; 

      using (Stream stream = File.Open(filePath, FileMode.Open, FileAccess.Read)) 
      { 
       serializedData = (T)serializer.Deserialize(stream); 
      } 

      return serializedData; 
     } 
     catch 
     { 
      throw; 
     } 
    } 
} 

나는 그래서이 같은 XML 출력을해야합니다을 구성 할.

Config config = new Config(); 
Facility fac = new Facility(); 
Profile prof = new Profile(); 

if (File.Exists(CONFIG_FILE)) config = Config.DeserializeObjectFromFile<Config>(CONFIG_FILE); 

fac.ID = "1"; 
fac.Name = "Facility One"; 
prof.SomeItem = "Value"; 
prof.AnotherItem = "Value"; 

config.Facilities.Add(fac); 
fac.Profiles.Add(prof); 


Config.SerializeObjectToFile<Config>(config, CONFIG_FILE); 

는 또한, 예를 들어, 내가 항목에 대한 변경 사항을 수정하고 저장할 수 있도록하려면 다음은

내가 직렬화를 실행하는 데 사용하고 코드입니다.

내가 가지고있는 문제는 형식으로 XML을 만들지 만, 값을 변경하면 기존 시설 목록 항목을 업데이트하는 대신 완전히 새로운 시설 항목이 만들어집니다.

+0

불분명 함. _에 대해 마음을 확인하십시오. "_ –

+0

_"형식의 XML을 만들 것이라고 _ 또는 _하지만 원하는대로 XML 파일을 만들지는 않지만 "_ 코드 너무. –

+0

모호한 점에 대해 사과드립니다. 내가 제거한 _ 그러나 그것은 원하는 XML 파일을 생성하지 않습니다 ._ 문. 두 번째 요청에 관해서는'prof.SomeItem = "New Value";를 변경하면 이전 값을 업데이트하고 새 값으로 바꾸는 대신 자식 항목과 함께 완전히 새로운 ''목록을 만듭니다. – Zach

답변

0

당신이

예를 클래스에 XML 구조를 구축하기 위해 [XML] 측면을 사용할 수있는 등 다음

public string Username { get; set; } 

로 직렬화 객체에 속성이 속성으로 공개해야한다

[xmlignore] 메서드 및 함수와 같이 직렬화하지 않으려는 항목의 경우

[xmlnode("Username")] 
public string Username { get; set; } 

더 있습니다. 당신은 모든 이들에 대한 XML 직렬화에 대한 Microsoft 설명서를 확인할 수 있습니다.

또한 클래스 상단에 [serializable] 화면을 배치해야 할 수도 있습니다.

+0

공개 필드는 눈에 띄지 만 핵심적인 문제는 아닙니다. –

관련 문제