2013-04-09 5 views
0

나는 C# 및 자바 크로스 플랫폼에서 직렬화 몇 가지 문제가있다. C#이 대기열/주제에 데이터를 게시하고 JAVA가 구독하고 있다고 가정 해 보겠습니다.푸른 서비스 버스 직렬화 문제 [C#을/JAVA]는

C#에서는 generic 형식 게시를 허용하는 표준 게시 메서드를 사용하여 TypeA 클래스와 함께 보낸 데이터를 자동으로 serialize합니다.

그런 다음 자바에서 TypeA 코드가 코딩되었지만 객체를 deserialize 할 수있는 API 디시리얼라이저를 찾을 수 없습니다.

자바 용 유효한 디시리얼라이저가 있습니까? 아니면 C#에서 직렬화해야합니다 (예 : JSON 사용)? 게시하고 JSON 디시리얼라이저로 자바에서 비 직렬화해야합니까?

미리 감사드립니다.

답변

0

BrokeredMessage에서 아무 것도하지 않으면 DataContractSerializers 중 하나가 사용됩니다 믿습니다. 코드를 표시하지 않았지만 BrokeredMessage 클래스를 사용하고 있다고 가정합니다. 크로스 플랫폼을 원하면 직렬화를 제어해야합니다. JSON에 직렬화하고 JSON을 문자열로 전달하거나 스트림 과부하를 사용하고 스트림을 압축하여 생성자에서 전달합니다 (큰 객체 인 경우). Java 클라이언트는 JSON 디시리얼라이저를 가져와 역순으로 처리해야합니다.

DataContractSerializer는 Java에서 쉽게 되돌릴 수 없습니다. 내가 할 수있을 것이라고 확신하지만 JSON 또는 protobuf를 사용하는 것이 더 쉽고 교차 플랫폼 방식입니다.

0

언어 간 이진 직렬화의 경우 refer to this question. 그러나이 경우 JSON을 사용합니다. 훨씬 간단 할 것입니다.

0

나는 당신의 기존 코드베이스에 관한 답변을 추측합니다. 가장 정통적인 방법은 C#에서 XmlSerializer를 사용하고 Java에서 JAXB를 사용하는 것입니다. 물론 완벽한 상호 운용성을 보장하려면 두 언어로 코드를 직접 검토해야합니다.

저는 두 언어 모두 여러 가지 직렬화/직렬화 방법을 지원한다고 생각합니다. 서로 호환되는 것을 찾아야합니다.

0
  1. C#을하기보다는 기본 계약 시리얼에 라이브러리를 직렬화의 선택을 사용합니다. (내가 JSON과 Newtonsoft.json을 사용할 것)

  2. var json = Newtonsoft.Json.Linq.JObject.FromObject(yourSerializableObject).ToString(); 
        var stream = new MemoryStream(); 
        var writer = new StreamWriter(stream); 
        writer.Write(json); 
        writer.Flush(); 
        stream.Position = 0; 
        _topicClient.Send(new BrokeredMessage(stream, true) { ContentType = "application/json" }); 
    
  3. 가 JSON 텍스트 스트림으로 메시지를 수신 JSON 텍스트 스트림으로 메시지를 게시

    var message = _subscriptionClient.Receive(); 
        Stream stream = message.GetBody<Stream>(); 
        StreamReader reader = new StreamReader(stream); 
        string s = reader.ReadToEnd(); 
    
관련 문제