2010-11-20 3 views
0

Silverlight 응용 프로그램과 ASP.Net 응용 프로그램에서 참조하는 Silverlight 어셈블리가 있습니다.Silverlight 어셈블리에 정의 된 형식의 이진 직렬화

ASP.Net 응용 프로그램에서 실버 라이트 어셈블리에 정의 된 유형의 인스턴스 중 일부를 직렬화 (이진)해야합니다. 아무도 이것으로 나를 도울 수 있습니까?

편집

내 문제는 내가 필요 내 asp.net 응용 프로그램과 윈폼 응용 프로그램에서는, silverilght 애플리케이션, asp.net 응용 프로그램과 윈폼 응용 프로그램에서 사용하는 실버 어셈블리를 가지고있다 공유 silverlight assmebly에 정의 된 유형을 직렬화합니다.

또한 약간 다른 메모에서이 속성이 필요한 이유를 설명 할 수 있습니까?

+0

은 바이너리 직렬화가 엄격히 필요합니까? 사실 데이터를 직렬화하고 Silverlight 응용 프로그램과 ASP.NET 페이지에서 사용하는 가장 일반적인 방법은 JSON 직렬화입니다. –

+0

@zenonych - 내 실버 라이트 애플 리케이션에서 이진 직렬화 개체를 찾고 아니에요. pls 내 질문을 확인 편집 좀 더 정보를 추가했습니다. –

+0

나는 나의 대답을 바꾸었다. 다시 보아라. –

답변

0

나는 직렬화 특성이없는 바이너리 직렬화 유형에 할 수있는 sharp serializer라는 것을 사용을 시도 할 수 있습니다.

0

당신은 빌드 직렬화 특성 (코드)이 아닌 실버 라이트를 포함 #if 지시어를 사용할 수 있습니다 :이 속성이 필요한 이유 몇 가지 중 하나를 설명 수 또한

#if !SILVERLIGHT 
[Serializable] 
#endif 
public class SomeClass 
{ 
} 
+0

나는 Silverlight 응용 프로그램에서 이진 직렬화를 사용하는 방법이 아니라 SerializableAttribute를 사용하지 않는 방법을 알고 있습니다. –

+0

그는 실버 라이트 어셈블리를 사용합니다. 즉, 그는 SerializableAttribute를 전혀 사용할 수 없다는 의미입니다. –

+0

내 문제는 내가 silverilght 응용 프로그램, asp.net 응용 프로그램 및 winforms 응용 프로그램, 내 asp.net 응용 프로그램 및 winforms 응용 프로그램에서 공유 Silverlight assmebly 정의 된 형식을 serialize 할 필요가 사용되는 실버 어셈블리가 있다는 것입니다. 내 실버 라이트 애플 리케이션 –

1

을 약간 다른 노트에 ?

참조 : 직렬화 중에 BinaryFormatter는 FormatterServices 클래스의 메서드를 호출합니다.

private static bool CheckSerializable(RuntimeType type) 
{ 
    return type.IsSerializable; 
} 

이 코드와 유사에 :

Type t = typeof (SomeClass); 
    bool isTypeSerializable = t.IsSerializable; 

if (!CheckSerializable(type)) 
    { 
     throw new SerializationException(Environment.GetResourceString("Serialization_NonSerType", new object[] { type.FullName, type.Module.Assembly.FullName })); 
    } 

이 FormatterServices 클래스의 CheckSerializable 방법을 확인할 수 있습니다 : 그들 중 하나는

private static MemberInfo[] InternalGetSerializableMembers(RuntimeType type) 

이 방법은 다음 코드가 포함되어 있습니다

이 예에서는 SomeClass 클래스에 SerializableAttribute가 있으면 isTypeSerializable은 true입니다. 그렇지 않으면 거짓.
Soo ... 간단한 대답 :이 속성은 플래그이며 이는 클래스의 인스턴스를 일련 번호로 나타낼 수 있음을 나타냅니다. 그래서 그것은 단지 필요했습니다.

주 질문에 대해서는 :
아쉽게도 실버 라이트 어셈블리에 정의 된 클래스의 경우 이진 형식화 프로그램을 직접 사용할 수 없습니다.
프록시 클래스를 사용하는 한 가지 방법.
예 : 귀하의 실버 어셈블리 내부
등급 : 실버 조립을 참조하여 일반적인 .NET의 assemly 내부 직렬화를 지원

public class SomeClass 
{ 
    public int IntValue { get; set; } 
    public string StringValue { get; set; } 
    public bool BoolValue { get; set; } 
} 

Proxy 클래스 : 그래서 당신의 ASP에

[Serializable] 
    public class SomeClassProxy 
    { 
     public int IntValue { get; set; } 
     public string StringValue { get; set; } 
     public bool BoolValue { get; set; } 

     public static SomeClassProxy GetSerializableObject(SomeClass silverlightClass) 
     { 
      return new SomeClassProxy 
        { 
         IntValue = silverlightClass.IntValue, 
         StringValue = silverlightClass.StringValue, 
         BoolValue = silverlightClass.BoolValue 
        }; 
     } 

     public static SomeClass DeserializeSilverlightCompatible(Stream stream) 
     { 
      BinaryFormatter formatter = new BinaryFormatter(); 
      SomeClassProxy proxy = formatter.Deserialize(stream) as SomeClassProxy; 

      return new SomeClass 
      { 
       IntValue = proxy.IntValue, 
       StringValue = proxy.StringValue, 
       BoolValue = proxy.BoolValue 
      }; 
     } 
    } 

.그물이나 윈폼 응용 프로그램은 프록시 클래스로 작동한다 :

using(MemoryStream memoryStream = new MemoryStream()) 
     { 
      BinaryFormatter formatter = new BinaryFormatter(); 
          //create instance of silverlight class 
      SomeClass mySilverlightClass = new SomeClass(); 
      mySilverlightClass.IntValue = 555; 
      mySilverlightClass.StringValue = "Hello World!"; 
      mySilverlightClass.BoolValue = true; 

      //<===serialize and take care of silverlight instance 
      formatter.Serialize(memoryStream, SomeClassProxy.GetSerializableObject(mySilverlightClass)); 

      memoryStream.Seek(0, SeekOrigin.Begin); 
      //===>deserialize to silverlight instance 
      SomeClass mySilverlightClassRestored = SomeClassProxy.DeserializeSilverlightCompatible(memoryStream); 
     } 

그래서이 프록시는 직렬화 및 역 직렬화 (직렬화 복원 후 실버 어셈블리에 정의 된 클래스 SomeClass의 인스턴스를받을 수 있습니다)에서 모두 처리합니다. 바이너리 포맷 소프트 rescriction 인 경우

그럼 내가 대신 XML 시리얼 라이저를 사용하는 것이 좋습니다 수 있습니다

XmlSerializer s = new XmlSerializer(typeof(SomeClass)); 
s.Serialize(memoryStream, mySilverlightClass); 
memoryStream.Seek(0, SeekOrigin.Begin); 
SomeClass restored = s.Deserialize(memoryStream) as SomeClass; 

그것은 그 경우의 SerializableAttribute은 필요하지 않습니다.

+0

내 문제는 내가 silverilght 응용 프로그램, asp.net 응용 프로그램 및 winforms 응용 프로그램, 내 asp.net 응용 프로그램 및 winforms 응용 프로그램에서 공유 Silverlight assmebly 정의 된 형식을 serialize 할 필요가 사용되는 실버 어셈블리가 있다는 것입니다. 내 실버 라이트 애플 리케이션 –

+0

답장 주셔서 감사합니다, 간단한 요구 사항에 대한 작업을 많이하는 것 같다 이진 직렬화 구현 찾고 있어요. –

+0

@Vinay B R 그래, 그게 사실 :)하지만 어쨌든 내 제안 - SL에 대한 BinarySerialization을 사용하지 마십시오. Silverlight 응용 프로그램의 데이터를 serialize/deserialize하는 것은 자연스러운 방법이 아닙니다. –

0

당신은 .NET 및 실버 라이트 사이의 바이너리 데이터를 이동할 수있는 내 시리얼 ... http://whydoidoit.com

관련 문제