2010-02-05 3 views
2

다음과 같은 직렬화 방법이 있습니다. 문제는 이진 형식의 속성이 들어있는 클래스를 전달하려고 시도한다는 것입니다. 이 등록 정보 유형으로 인해 직렬화에 실패했습니다. 이진 형식의 속성을 사용하여 클래스를 serialize 할 수있는 방법이 있습니까?XML 직렬화 및 이진 속성이있는 클래스 - 어떻게 작동합니까?

private string Serialize<TEntity>(TEntity instance) 
    { 
     string retStr = ""; 
     XmlSerializer xs = new XmlSerializer(typeof(TEntity)); 
     System.IO.StringWriter writer = new System.IO.StringWriter(); 
     xs.Serialize(writer, instance); 
     retStr = writer.ToString(); 
     writer.Close(); 

     return retStr; 
    } 

다음은 이진 속성을 나타내는 클래스 부분입니다.

/// <summary> 
    /// Row version number 
    /// </summary> 
    [DataMember(Order = 5)] 
    public System.Data.Linq.Binary VersionNumber { get; set; } 
+0

"Binary"은 .NET 데이터 유형이 아닙니다. 어떻게 정의됩니까? 또한 정확한 예외를 게시하십시오. 예외를 잡은 다음 ex.ToString()을 게시하십시오. –

+0

이 속성이 정의 된 코드 스 니펫을 표시 할 수 있습니까? – Vivek

+1

해결 방법에 관심이 있으십니까? 직렬화에 문제가있는 클래스를 변경할 수 있습니까? 속성에 대해 정말로 신경 쓰지 않는다면 [XmlIgnore]를 시도해 볼 수 있습니까? – RedDeckWins

답변

2

System.Linq.Binary을 byte []로 변환하지 않는 이유는 무엇입니까? 내부적으로는 System.Linq.Binary이 불변 인 경우를 제외하고는 모두 동일합니다. 또한 이진 클래스에는 기본 생성자가 없으므로 직렬화가 실패합니다.

추가 읽기 : 다른 사람이 솔루션을 찾고 경우

0

문제에하지 토탈 솔루션, 다음과 같은 코드를 시도하십시오 동안 :

private string Serialize<TEntity>(TEntity instance) 
{ 
    try 
    { 
     XmlSerializer xs = new XmlSerializer(typeof(TEntity)); 
     using (System.IO.StringWriter writer = new System.IO.StringWriter()) 
     { 
      xs.Serialize(writer, instance); 
      return writer.ToString(); 
     } 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex.ToString()); 
     throw; 
    } 
} 
+0

@ 존 - 나는 무지하다는 것을 의미하지는 않지만이 코드는 무엇을 성취해야 하는가? 그것은 기본적으로 내가 지금하고있는 일입니다. –

+0

@Randy : 그것은 당신이 잘못하고있는 일이며, 예외가 발생하면 여기에 게시 할 수 있습니다. –

0

면책 조항 : 나는 WCF도 직렬화에 전문가가 아니다, 아래의 솔루션에서 가장 해키 및 간략한 검증을 거쳤습니다.

public class HasBinaryProperty 
{ 
    public byte[] versionBytes; 

    public HasBinaryProperty() 
    {//ignore this used it to test the serialization of the class briefly 
     Random rand = new Random(); 
     byte[] bytes = new byte[20]; 
     rand.NextBytes(bytes); 
     this.VersionNumber = new Binary(bytes); 
    } 

    [XmlIgnore] 
    public Binary VersionNumber 
    { 
     get 
     { 
      return new Binary(this.versionBytes); 
     } 
     set 
     { 
      this.versionBytes = value.ToArray(); 
     } 
    } 
} 
3

비트는 늦었지만, 여기 내 게시 할 예정입니다 :

먼저 System.Xml.Serialization.Xml을 추가하십시오.() 바이트로 바이너리 값을 사용할 수 있도록하는 새로운 속성을 추가,

Public Property BerichtAsByte As Byte() 
     Get 
      If Me.Bericht Is Nothing Then Return Nothing 
      Return Me.Bericht.ToArray 
     End Get 
     Set(value As Byte()) 
      If value Is Nothing Then 
       Me.Bericht = Nothing 
      Else 
       Me.Bericht = New Data.Linq.Binary(value) 
      End If 
     End Set 
    End Property 

<Global.System.Data.Linq.Mapping.ColumnAttribute(Storage:="_Bericht", DbType:="VarBinary(MAX)", UpdateCheck:=UpdateCheck.Never), 
    System.Xml.Serialization.XmlIgnore> _ 
    Public Property Bericht() As System.Data.Linq.Binary 
     Get 
      Return Me._Bericht.Value 
     End Get 
     Set(value As System.Data.Linq.Binary) 
      If (Object.Equals(Me._Bericht.Value, Value) = False) Then 
       Me.OnBerichtChanging(Value) 
       Me.SendPropertyChanging() 
       Me._Bericht.Value = Value 
       Me.SendPropertyChanged("Bericht") 
       Me.OnBerichtChanged() 
      End If 
     End Set 
    End Property 

둘째를 그리고 그것 뿐이다 : 내 경우

을 : 이진 속성을 무시합니다. 이제 엔티티는 직렬화 가능하며 모든 특성을 저장합니다.