2009-12-01 3 views
1

반영 기반 XML 직렬기를 빠르고 빠르 게 구현 한 사람은 누구입니까?신속하고 더러운 반영 기반 XML 직렬화 기

무서운 시작 시간으로 인해 XML 직렬화 코드를 추출하려고합니다. sgen.exe에 대해 알고 있지만 빌드 및 패키징 프로세스를 복잡하게 만들고 싶지는 않습니다.

우리는 파일에서 구성 값을 추출하기 위해 시작시 XML 직렬화를 사용합니다. 반사 히트는 최소화 될 것이고, 우리는 20-40 값을 최대로 말하고 있습니다. 우리는 여기서 아무 것도 빨리 할 필요가 없습니다. 제 경우에는 500-700ms 인 XML 시리얼 라이저를 컴파일하기 위해 히트를 치고 싶지 않습니다.

나는 또한 코드의 제어를 원한다. 나는 매우 강력한 오류 처리를 원한다.

나는 protobuf.net에 대해 알고 있지만 과장 될 수 있습니다. 데이터 계약을 살펴보면 제한적일 수 있으며 피할 수있는 장식이 많이 필요합니다.

답변

1

sgen을 사용하여 시리얼 라이저를 미리 컴파일 해 보셨습니까? 당신은/K [EEP] 옵션 sgen.exe를 사용하는 경우

http://blog.lab49.com/archives/2358

+0

죄송합니다 정말 무례 소리를 의미하지 않는다, 그러나 sgen가 완전히 의문의 여지가있다. –

1

는, 당신이 다음 프로젝트에 통합 할 수있는 생성 된 C# 소스를 유지합니다. 적합하다고 생각하는대로 사용자 정의 할 수 있습니다.

EDIT : 다른 말로하면, 당신은 pre-compiler (당신이 할 수 없다고 말하는)가 아닌 sgen을 코드 생성기로 사용하고 있습니다.

3

값이 20에서 40 사이 인 경우 직렬화 malarkey를 모두 버리고 손으로 코딩하지 않으시겠습니까? 시간을 들여 놓고 설정 읽기 클래스를 코딩 할 수 있어야합니다. 지옥, 코드를 생성하고 일찍 집에 갈 수 있습니다. 그렇게하면 강력하고 오류 처리가 가능하며 700ms보다 빠른 속도로 실행됩니다.

+0

동의합니다. 실행 속도에 관심이 있다면 리플렉션을 사용하는 것이 좋지 않은 것 같습니다. – overslacked

+0

리플렉션은 내 경우에 그렇게 큰 타격을 입지는 않습니다. DOM을로드하려면 63ms가 소요됩니다 (앞으로 파싱하는 것이 훨씬 빠른 경로이지만 노력할 가치가 없을 수도 있습니다). 리플렉션을 사용하여 내 필드를로드하려면 17ms가 필요합니다. 최적화가 완료되지 않았습니다. –

1

I wrote my own ... 비슷한 스펙을 가진 사람이라면 BSD 라이센스하에 자유롭게 사용하십시오. 여기

는 sgen는 옵션이 아닌 곳은 설정 파일 시나리오 만 훨씬 빠른 단지 XML 시리얼 라이저처럼 아름다운 XML을 생성, 일부 샘플 시험이다 :

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IO; 
using NUnit.Framework; 
using MediaBrowser.Library.Persistance; 

namespace TestMediaBrowser.Unit { 
    [TestFixture] 
    public class TestXmlSettings { 

     enum Farts { 
      Smelly, 
      SilentButDeadly 
     } 

     class Monster { 
      public Weapon Weapon; 
     } 

     class Weapon { 
      public int LaserCount { get; set; } 
     } 

     class Farter { 
      public Farts Smell = Farts.Smelly; 
     } 

     class Group { 
      public List<Person> People; 
     } 

     class Person { 
      public int Age = 1; 
      public string Name = "Default"; 
      public bool Happy = true; 
      public DateTime Birthdate = DateTime.Now; 
     } 

     class Account { 
      public Person Person; 
      public int Balance; 
     } 

     const string CONFIG_FILE = "test.config"; 

     private void ClearConfig() { 
      if (File.Exists(CONFIG_FILE)) { 
       File.Delete(CONFIG_FILE); 
      } 
     } 

     public void TestProperty() { 
      ClearConfig(); 
      Monster monster = new Monster(); 
      XmlSettings<Monster> settings = XmlSettings<Monster>.Bind(monster, CONFIG_FILE); 
      monster.Weapon = new Weapon(); 
      monster.Weapon.LaserCount = 99; 
      settings.Write(); 

      monster = new Monster(); 
      settings = XmlSettings<Monster>.Bind(monster, CONFIG_FILE); 

      Assert.AreEqual(monster.Weapon.LaserCount, 99); 
     } 

     public void TestEnum() { 
      ClearConfig(); 
      Farter farter = new Farter(); 
      XmlSettings<Farter> settings = XmlSettings<Farter>.Bind(farter, CONFIG_FILE); 
      farter.Smell = Farts.SilentButDeadly; 
      settings.Write(); 

      farter = new Farter(); 
      settings = XmlSettings<Farter>.Bind(farter, CONFIG_FILE); 

      Assert.AreEqual(farter.Smell, Farts.SilentButDeadly); 
     } 

     [Test] 
     public void TestList() { 
      ClearConfig(); 
      Group group = new Group(); 
      group.People = new List<Person>(); 
      group.People.Add(new Person()); 
      group.People.Add(new Person()); 
      XmlSettings<Group> settings = XmlSettings<Group>.Bind(group, CONFIG_FILE); 
      settings.Write(); 

      group = new Group(); 
      settings = XmlSettings<Group>.Bind(group, CONFIG_FILE); 

      Assert.AreEqual(group.People.Count, 2); 

     } 

     [Test] 
     public void BasicValueTypeTest() { 
      ClearConfig(); 
      var person = new Person(); 
      XmlSettings<Person> settings = XmlSettings<Person>.Bind(person, CONFIG_FILE); 
      person.Age = 3; 
      person.Name = "Sam"; 
      person.Happy = false; 
      person.Birthdate = DateTime.Today; 
      settings.Write(); 

      person = new Person(); 
      settings = XmlSettings<Person>.Bind(person, CONFIG_FILE); 

      Assert.AreEqual(person.Age, 3); 
      Assert.AreEqual(person.Name, "Sam"); 
      Assert.AreEqual(person.Happy, false); 
      Assert.AreEqual(person.Birthdate, DateTime.Today); 
     } 

     [Test] 
     public void NestedObjectTypeTest() { 
      ClearConfig(); 
      var account = new Account(); 
      var settings = XmlSettings<Account>.Bind(account, CONFIG_FILE); 
      var person = new Person(); 
      person.Age = 3; 
      person.Name = "Sam"; 
      person.Happy = false; 
      person.Birthdate = DateTime.Today; 

      account.Person = person; 
      account.Balance = 999; 

      settings.Write(); 

      account = new Account(); 
      settings = XmlSettings<Account>.Bind(account, CONFIG_FILE); 


      person = account.Person; 
      Assert.AreEqual(account.Balance, 999); 
      Assert.AreEqual(person.Age, 3); 
      Assert.AreEqual(person.Name, "Sam"); 
      Assert.AreEqual(person.Happy, false); 
      Assert.AreEqual(person.Birthdate, DateTime.Today); 
     } 
    } 
}