2011-11-28 3 views
0

XmlSerializer를 사용하고 있으며, XmlSerializer를 사용하여 일부 노드의 형식을 출력하도록 재정의 또는 그 효과를 사용하는 방법이 있는지 궁금합니다.XmlSerializer에서 xml 유형을 출력합니다.

내 문제는 내가 바이트 배열을 직렬화했다는 것입니다.

class MyClass { 
    public string Name { get; set; } 
    public byte[] Bytes { get; set; } 
} 

일반적인 서비스에서 xml을 사용하고 있습니다. 서비스가 xml을 수집합니다.

<MyClass> 
    <Name>Test</Name> 
    <Bytes>U2NhcnkgQnVnZ2Vy</Bytes> 
</MyClass> 

, 실행시에 XSD, 또는 같은 어떻게 든 출력 뭔가를 생성하는 중 어떤 방법이 있습니까.

직렬화하는 클래스를 변경할 수 없지만 serializer에 재정의를 적용하거나 다른 방법으로 직렬화를 제어 할 수 있습니다.

<Bytes xsi:type='BinaryOfSomeKind'>BlahBlah</Bytes> 

필자는 데이터가 어떻게 든 바이너리임을 알아야합니다.

감사합니다.

크레이그.

+0

문제를 올바르게 이해하고 있는지 알 수 없습니다. 항상 같은 구조를 지닌 XML을 사용하고 있습니까?하지만 요소 유형이 다를 수 있습니다. –

+0

클래스를 xml로 변환 중입니다. 수업은 제 3자가 제공합니다. 나는 xml을 가져 와서 내용을 색인하고있다. 어떤 필드가 바이너리인지 알아야합니다. xsd를 생성하는 쉬운 방법이 있다면 그것을 받아 들일 수도 있습니다. xsd를 생성하는 코드를 제공 할 수 있습니다. 아마 어리석은 질문이었을 것입니다. – Jim

+0

클래스가 제 3 자에 의해 제공되는 경우 속성 및 속성 유형을 알고 있으므로 XML을 추론 할 수 있습니다. 수동으로 XSD를 만들 수도 있습니다. –

답변

0

클래스가 제 3 자에 의해 제공되는 경우 속성 및 속성 유형을 알고 XML 및 XSD를 추론 할 수 있습니다. XSD를 수동으로 만들거나 XML 도구 (예 : XMLSpy (무료 BTW가 아님) 또는 XMLFox)를 사용하여 무료로 만들 수 있습니다.

0

xml이 질문에 넣은 형식으로되어 있고 수업 준비가되어 있다면 xml이 비 직렬화되도록 꾸밀 수 있습니다.

역 직렬화 클래스 :

[XmlTypeAttribute] 
[XmlRootAttribute("MyClass")] 
public class MyClass 
{ 
    [XmlElementAttribute("Name")] 
    public string Name { get; set; } 

    [XmlElementAttribute("Bytes")] 
    public byte[] Bytes { get; set; } 
} 

Deserialzation 방법

public static object Deserialize(string xml) 
{ 
     var deserializer = new System.Xml.Serialization.XmlSerializer(typeof(MyClass)); 
     using (var reader = XmlReader.Create(new StringReader(xml))) 
     { 
      return (MyClass)deserializer.Deserialize(reader); 
     } 
} 

메인 방법은

static void Main(string[] args) 
    { 
     string xml = @"<MyClass> 
     <Name>Test</Name> 
     <Bytes>U2NhcnkgQnVnZ2Vy</Bytes> 
     </MyClass>"; 

     MyClass obj = (MyClass)Deserialize(xml); 
     Console.ReadKey(); 

    } 

다음 using 문 추가해야합니다 :

바이트 배열로 "Test"를 사용하여 obj로 deserialize했습니다.

런타임에 XSD를 생성하면 어떤 속성이 있는지 알 수 없으며 특정 속성을 테스트하기 위해 리플렉션을 사용하는 것이 아니라 다음에 어떤 유형이 될 수 있는지 찾아야합니다 이게 네 뒤에 온거야?

+0

안녕하세요, 불행히도 그게 효과가 없을 것 같습니다. 나는 형식이 없다. 그 문자열이 바이너리라는 것을 알아야합니다. 형식을 발신 XML에 추가하거나 스키마를 생성하거나 자체 serializer를 작성해야합니다. 귀하의 솔루션으로는 충분하지 않습니다. 나는 바이너리를 알고 있지만 시리얼 라이저가 작동한다는 것을 잘 알고있다. – Jim

+0

그래서 MyClass가 직렬화되는 방법을 제어하려하지만 클래스를 전혀 장식 할 수 없습니다. 하지만 설명하는 형식으로 출력해야합니까? 그게 맞습니까? – Chris

+0

오버라이드에서 serializer에 전달 될 수 있으므로 클래스를 모든 속성으로 꾸밀 수 있습니다. 나는 xsd를 생성 할 수있다. 클래스를 serialize 할 수있는 클래스를 통해이를 반영 할 수 있습니다. 난 바이너리 필드의 xml 타입이 무엇인지 알 필요가있다. serializer를 삭제하고 리플렉션을 사용하려고합니다. 나는 수업을 변경할 수 없다. 수업은 제 3자가 제공합니다. – Jim

관련 문제