2015-01-02 2 views
1

현재 Windows Store 및 Xamarin 환경을 대상으로하는 교차 플랫폼 C# 응용 프로그램 개발자입니다. 공유 라이브러리 (PCL)는 모든 애플리케이션에서 참조하며, 여기에는 스토리지, 네트워킹, 데이터베이스 및 설정을 비롯한 핵심 애플리케이션 로직과 알고리즘을 정의합니다.C# PCL 설정을 저장하는 가장 좋은 방법은 무엇입니까

내가 필요한 설정을 저장하는 더 똑똑한 방법입니다. 이러한 방법이 완전히 구식으로 나는 다음이 C#으로 쉽게 가능하며, 모든 키와 값의 방법이나 XML 파일을 사용하지 않습니다

[SettingsNode("app_settings")] 
class AppSettings 
{ 
    public double SomeNumber; 
    public object SomeSerializable; 

    public byte[] SomeBytes; 

    [SettingsNode("custom_setting_name")]//just specifying XML/etc node name with SettingsNode attribute 
    public string SomeKey; 
} 

class x 
{ 
    void y() 
    { 
     AppSettings superSettingsSolution = Engine.LoadEntry<AppSettings>("test.xml"); 
     superSettingsSolution.SomeBytes = new byte[10]; 
     superSettingsSolution.SomeNumber = 4.6d; 
     superSettingsSolution.SomeSerializable = new object();//[Serializable] class 
     Engine.SaveEntry<AppSettings>("test.xml", superSettingsSolution); 
    } 
} 

내가 크로스 플랫폼 저장 PCLStorage 패키지를 사용하려고, 그래서 내 코드에서 System.Windows.Storage를 참조하지 않고 싶지 않습니다.

내 질문 : C#의 PCL에 대한 내 코드 예제 라이브러리/프로젝트/패키지와 가까운 것이 있습니까? 나는 사소한 것을 묻는다면 미안하지만, 나는 'portable'/ windows8 프로그래머는 아직 experinced하지 않았다.

+0

"키 값 방식이나 XML 파일은 이러한 방법이 완전히 구식이므로"라고하는 이유는 무엇입니까? –

+0

@ DeblatonJean-Philippe 우리가 검색하고자하는 키 이름으로 문자열을 사용하기 때문에 항상 동일하지만 value라는 코드 요청이 발생할 때마다 문자열 이름이 지정된 매개 변수를 찾고 사용 가능한 모든 키를 열거하고 비교합니다 (+ 시간). 우리는 '네이티브'속성과 클래스 필드를 사용할 수 있습니다. 또한 이름은 변경되지 않으며 코드에서 문자열로 지정할 필요가 없습니다 (대부분의 경우). – Croll

+0

고전적인 XmlSerializer 및 [XmlElement], [XmlAttribute] .. 등의 특성을 사용하여 xml 입/출력을 형성 할 수 있습니다. –

답변

1
using System.Xml.Serialization; 
    using PCLStorage; 
    using System.IO; 

    public virtual async Task<T> LoadSettings<T>(IFile file = null) 
     where T : IApplicationSettings 
    { 
     // File 
     if (file == null) 
      file = DefaultSettingsFile; 

     // Open file 
     using (Stream fileStream = await file.OpenAsync(FileAccess.Read)) 
     { 
      var xmls = new XmlSerializer(typeof(T)); 
      return (T)xmls.Deserialize(fileStream); 
     } 
    } 

    public virtual async Task SaveSettings(object settings, IFile file = null) 
    { 
     // File 
     if (file == null) 
      file = DefaultSettingsFile; 

     // Open file 
     using (Stream fileStream = await file.OpenAsync(FileAccess.ReadAndWrite)) 
     { 
      var xmls = new XmlSerializer(settings.GetType()); 
      xmls.Serialize(fileStream, settings); 
     } 
    }