일반적인 방법으로 직렬화 할 수있는 것을 포함시키기 위해 유형 제약 조건을 추가하려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/945495

문제

내 일반적인 방법은 객체를 통과 한 객체를 직렬화해야하지만, iserializable이 작동하지 않는다고 주장하면 예를 들어, 웹 서비스 (SerializableAttribute로 표시됨)에서 구조물이 반환되어 XML로 직렬화되어 예상대로 C# 컴파일러가 불평합니다.

객체를 직렬화하기 전에 직렬화 할 수 있는지 확인할 수있는 방법이 있습니까? where 객체를 확인하는 키워드가 적합합니까?

내 전체 방법은 다음과 같습니다.

public static void Push<T>(string url, T message)
        where T : ISerializable
{
    string xml = SerializeMessage(message);

    // Send the message to Amazon SQS
    SendMessageRequest sendReq = new SendMessageRequest { QueueUrl = url, MessageBody = xml };
    AmazonSQSClient client = new AmazonSQSClient(S3User, S3Pass);
    client.SendMessage(sendReq);
}

Serializemessage :

private static string SerializeMessage<T>(T message)
{
    XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
    using (StringWriter stringWriter = new StringWriter())
    {
        xmlSerializer.Serialize(stringWriter, message);
        return stringWriter.ToString();
    }
}

이것이 불가능한 경우 런타임에 객체를 직렬화 할 수 있는지 확인하는 가장 좋은 방법은 무엇입니까?

도움이 되었습니까?

해결책

일반적인 제약을 통해 완전히 할 수는 없지만 도움을 줄 몇 가지 작업을 수행 할 수 있습니다.

1) 새로운() 일반 유형의 제약 조건 (XMLSerializer가 기본 CTOR의 부족에 대해 불평하지 않도록 할 수있는 능력을 가능하게합니다) :

where T : new()

2) 메소드의 첫 번째 줄에서 직렬화 (또는 생성자 또는 반복적으로 반복 할 필요가없는 다른 곳) 에서이 점검을 수행 할 수 있습니다.

if( !typeof(T).IsSerializable && !(typeof(ISerializable).IsAssignableFrom(typeof(T)) ) )
    throw new InvalidOperationException("A serializable Type is required");

물론 유형을 직렬화하려고 할 때 런타임 예외가 여전히있을 가능성이 있지만 가장 명백한 문제를 다룰 것입니다.

다른 팁

나는 당신이 도움이 될 수있는이 주제에 대한 길이의 블로그 기사를 썼습니다. 주로 이진 직렬화로 들어가지만 개념은 대부분의 직렬화 형식에 적용됩니다.

길고 짧은 것입니다

  • 신뢰할 수있는 일반적인 제약 조건을 추가 할 방법이 없습니다.
  • 물체가 확인하고 확인하는 유일한 방법 ~였다 직렬화 가능한

객체가 직렬화 할 수 있는지 알 수있는 유일한 방법은 직렬화를 시도하는 것입니다.

실제로, 당신은 유형이 "직렬화 가능하다"고 말하는 방법을 묻고 있었지만 실제 질문은 객체와 관련이 있습니다. 유형이 [직렬화 가능]으로 표시되어 있더라도 유형의 일부 인스턴스는 직렬화 할 수 없을 수 있습니다. 예를 들어, 인스턴스에 원형 참조가 포함되어 있으면 어떻게됩니까?

대신에

xmlserializer xmlserializer = new xmlserializer (typeof (t));

노력하다

xmlserializer xmlserializer = new xmlserializer (message.gettype ());

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top