2010-03-14 3 views
1

를 직렬화 복원에서 파생 클래스 ... 수집 가능한이 정의직렬화의 나는 다음과 같은 방법이있는 저장소 클래스가 일반 컬렉션 아직 일반 컬렉션

public T Single<T>(Predicate<T> expression) 
{ 
    using (var list = (Models.Collectable<T>)System.Xml.Serializer.Deserialize(typeof(Models.Collectable<T>), FileName)) 
    { 
     return list.Find(expression); 
    } 
} 

..

[Serializable] 
public class Collectable<T> : List<T>, IDisposable 
{ 
    public Collectable() { } 

    public void Dispose() { } 
} 

그리고 아이템이 그것을 사용합니다 ..

[Serializable] 
[System.Xml.Serialization.XmlRoot("Titles")] 
public partial class Titles : Collectable<Title> 
{ 
} 

문제는 내가 그것을 호출 할 때, 그것은 "Collecta ble "를 XmlRoot로 만들지 만 XmlRoot는"제목 "(모든 개체 제목)입니다.

이렇게 여러 .xml 파일로 수집되는 클래스가 있지만 일반 접근자가 파일을로드 할 때 기본 메서드를 다시 작성하는 것이 무의미한 것처럼 보이지만 각 파일에 적절한 루트 이름을 적용하려면 어떻게해야합니까? 각각에 대한 하드 코딩 방법없이? [System.Xml.Serialization.XmlRoot]는 무시 된 것 같습니다.

다음과 같이이라고

...

var titles = Repository.List<Models.Title>(); 

내가는 XML과 같은 포맷을 제외하고

<Titlesxmlns=''> was not expected. 

를 얻을. ..

<?xml version="1.0" encoding="utf-16"?> 
<Titles xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Title> 
     <Id>442daf7d-193c-4da8-be0b-417cec9dc1c5</Id> 
    </Title> 
</Titles> 

다음은 비 직렬화 코드입니다.

public static T Deserialize<T>(String xmlString) 
    { 
     System.Xml.Serialization.XmlSerializer XmlFormatSerializer 
      = new System.Xml.Serialization.XmlSerializer(typeof(T)); 

     StreamReader XmlStringReader = new StreamReader(xmlString); 

     //XmlTextReader XmlFormatReader = new XmlTextReader(XmlStringReader); 

     try 
     { 
      return (T)XmlFormatSerializer.Deserialize(XmlStringReader); 
     } 
     catch (Exception e) 
     { 
      throw e; 
     } 
     finally 
     { 
      XmlStringReader.Close(); 
     } 
    } 
+0

원하는 XML 예제를 보여주십시오. 또한 참고로 XML Serializer는'[Serializable]'속성을 무시합니다. –

+0

좋아, 이걸 추가했습니다. – Ciel

+0

감사. 이제 귀하가받은 완전한 예외를 보여주십시오. 그것을 잡아서'ex.ToString()'의 출력을 게시하십시오. –

답변

1

그것은 에 문서의 루트에 대한 이해를 할 수 없습니다 모음. 컬렉션이 포함되어 있지만 일 수는 없습니다.


문제가 더 간단 해 보입니다. 일반 제네릭 유형 (Models.Collectable<T>)을 사용하여 직렬기를 만들 수 없습니다. 대신 typeof(Titles)을 사용해보세요.


나는 저장소 클래스에 대해 몇 가지 가정을하고 있지만이 작업과 비슷한 것이 있습니까?

public class Repository<T> 
{ 
    protected static TextReader FileName { get; set; } 

    public static TCollection List<TCollection>() 
    { 
     var ser = new XmlSerializer(typeof (TCollection)); 
     return (TCollection) ser.Deserialize(FileName); 
    } 

    public static TItem Single<TItem, TCollection>(Predicate<TItem> expression) 
     where TCollection : IDisposable, IEnumerable<TItem> 
    { 
     using (var list = List<TCollection>()) 
     { 
      return list.Single(item => expression(item)); 
     } 
    } 
} 
+0

잘 모르겠습니다. 필자는 Collection에서 Serializer를 호출 했으므로 파일을 출력하는 방법입니다. 이전에는 항상 작동했는데, 이것은 처음입니다. 나는 우리에게 시험해 보았습니다. 그것을 가진 Generics. – Ciel

+0

항상'XmlRoot'를 사용 했습니까? –

+0

예, 저는 항상 직렬화를위한 모든 클래스에이 클래스를 사용했습니다. – Ciel

관련 문제