base64Binary的WCF序列化未正确编码

时间:2011-05-31 11:26:51

标签: wcf serialization base64

问候!

所以我有一个基类,它定义了一个base64Binary属性,作为XML中的嵌入文件返回。我没有收到任何错误,但是返回的字符串没有被编码为base64。有任何想法吗?我已经包含了基类,以及调用它的代码。任何帮助都 非常 赞赏!!

'--------------------------------------------------
'BinaryObjectType type
'--------------------------------------------------
<XmlType(TypeName:="BinaryObjectType",Namespace:=Declarations.SchemaVersion),Serializable, _
EditorBrowsable(EditorBrowsableState.Advanced)> _
Public Class BinaryObjectType
    '*********************** format attribute ***********************
    <XmlAttribute(AttributeName:="format", Form:=XmlSchemaForm.Unqualified, DataType:="string", Namespace:=Declarations.SchemaVersion), _
    EditorBrowsable(EditorBrowsableState.Advanced)> _
    Public __format As String

    <XmlIgnore()> _
    Public Property format As String
        Get
            format = __format
        End Get
        Set(ByVal Value As String)
            __format = Value
        End Set
    End Property

    '*********************** mimeCode attribute ***********************
    <XmlAttribute(AttributeName:="mimeCode", Form:=XmlSchemaForm.Unqualified, Namespace:=Declarations.SchemaVersion), _
    EditorBrowsable(EditorBrowsableState.Advanced)> _
    Public __mimeCode As String

    <XmlIgnore()> _
    Public Property mimeCode As String
        Get
            mimeCode = __mimeCode
        End Get
        Set(ByVal Value As String)
            __mimeCode = Value
        End Set
    End Property

    '*********************** encodingCode attribute ***********************
    <XmlAttribute(AttributeName:="encodingCode", Form:=XmlSchemaForm.Unqualified, DataType:="normalizedString", Namespace:=Declarations.SchemaVersion), _
    EditorBrowsable(EditorBrowsableState.Advanced)> _
    Public __encodingCode As String

    <XmlIgnore()> _
    Public Property encodingCode As String
        Get
            encodingCode = __encodingCode
        End Get
        Set(ByVal Value As String)
            __encodingCode = Value
        End Set
    End Property

    '*********************** characterSetCode attribute ***********************
    <XmlAttribute(AttributeName:="characterSetCode", Form:=XmlSchemaForm.Unqualified, DataType:="normalizedString", Namespace:=Declarations.SchemaVersion), _
    EditorBrowsable(EditorBrowsableState.Advanced)> _
    Public __characterSetCode As String

    <XmlIgnore()> _
    Public Property characterSetCode As String
        Get
            characterSetCode = __characterSetCode
        End Get
        Set(ByVal Value As String)
            __characterSetCode = Value
        End Set
    End Property

    '*********************** uri attribute ***********************
    <XmlAttribute(AttributeName:="uri", Form:=XmlSchemaForm.Unqualified, DataType:="anyURI", Namespace:=Declarations.SchemaVersion), _
    EditorBrowsable(EditorBrowsableState.Advanced)> _
    Public __uri As String

    <XmlIgnore()> _
    Public Property uri As String
        Get
            uri = __uri
        End Get
        Set(ByVal Value As String)
            __uri = Value
        End Set
    End Property

    '*********************** filename attribute ***********************
    <XmlAttribute(AttributeName:="filename", Form:=XmlSchemaForm.Unqualified, DataType:="string", Namespace:=Declarations.SchemaVersion), _
    EditorBrowsable(EditorBrowsableState.Advanced)> _
    Public __filename As String

    <XmlIgnore()> _
    Public Property filename As String
        Get
            filename = __filename
        End Get
        Set(ByVal Value As String)
            __filename = Value
        End Set
    End Property

    '*********************** XmlText field ***********************
    <XmlText(DataType:="base64Binary"), _
    EditorBrowsable(EditorBrowsableState.Advanced)> _
    Public __Value As Byte()

    <XmlIgnore()> _
    Public Property Value() As Byte()
        Get
            Value = __Value
        End Get
        Set(ByVal val As Byte())
            __Value = val
        End Set
    End Property

    '*********************** Constructor ***********************
    Public Sub New()
    End Sub
End Class

以下是构建它的片段:

Dim binFile As New BinaryObjectType

Select Case Trim(UCase(objFromDB.FileFormat))
    Case "PDF"
        binFile.mimeCode = "application/pdf"
    Case "DOC"
        binFile.mimeCode = "application/ms-word"
    Case "DOCX"
        binFile.mimeCode = "application/ms-word"
    Case "GIF"
        binFile.mimeCode = "image/gif"
    Case "JPG"
        binFile.mimeCode = "image/jpeg"
    Case "JPEG"
        binFile.mimeCode = "image/jpeg"
    Case "PNG"
        binFile.mimeCode = "image/png"
    Case Else
        binFile.mimeCode = "text/html"
    End Select

    binFile.Value = objFile
    attachmentArea.EmbeddedData = binFile
    attachmentAreaList.Add(attachmentArea)
    candidateProfile.AttachmentCollection = attachmentAreaList        
    candidateProfileList.Add(candidateProfile)        
    candidateArea.CandidateProfileCollection = candidateProfileList        
    candidateAreaList.Add(candidateArea)        
    dataArea.Show = showArea        
    dataArea.CandidateCollection = candidateAreaList        
    showResponse.DataArea = dataArea

    Return showResponse

我没有收到错误,我得到了binFile.Value的结果,但它没有被base64编码。

有什么想法吗? 在此先感谢!!!

1 个答案:

答案 0 :(得分:0)

你怎么看到字符串不是base64编码的?我尝试了类似的场景(见下文),并且Byte()在base-64中正确编码。

Public Class StackOverflow_6186859_751090

    Public Class Declarations
        Public Const SchemaVersion As String = "http://my.namespace"
    End Class

    'BinaryObjectType type 
    '-------------------------------------------------- 
    <XmlType(TypeName:="BinaryObjectType", Namespace:=Declarations.SchemaVersion), Serializable(), _
     EditorBrowsable(EditorBrowsableState.Advanced)> _
     Public Class BinaryObjectType
        <XmlAttribute(AttributeName:="format", Form:=XmlSchemaForm.Unqualified, DataType:="string", Namespace:=Declarations.SchemaVersion), _
             EditorBrowsable(EditorBrowsableState.Advanced)> _
             Public __format As String
        <XmlIgnore()> _
        Public Property format() As String
            Get
                format = __format
            End Get
            Set(ByVal Value As String)
                __format = Value
            End Set
        End Property

        <XmlAttribute(AttributeName:="mimeCode", Form:=XmlSchemaForm.Unqualified, Namespace:=Declarations.SchemaVersion), _
         EditorBrowsable(EditorBrowsableState.Advanced)> _
        Public __mimeCode As String
        <XmlIgnore()> _
        Public Property mimeCode() As String
            Get
                mimeCode = __mimeCode
            End Get
            Set(ByVal Value As String)
                __mimeCode = Value
            End Set
        End Property

        <XmlText(DataType:="base64Binary"), _
         EditorBrowsable(EditorBrowsableState.Advanced)> _
        Public __Value As Byte()
        <XmlIgnore()> _
        Public Property Value() As Byte()
            Get
                Value = __Value
            End Get
            Set(ByVal val As Byte())
                __Value = val
            End Set
        End Property

    End Class

    Public Shared Sub Test()
        Dim ms As MemoryStream = New MemoryStream()
        Dim ser As XmlSerializer = New XmlSerializer(GetType(BinaryObjectType))
        Dim obj As BinaryObjectType = New BinaryObjectType()
        obj.format = "PNG"
        obj.mimeCode = "image/png"
        obj.Value = Encoding.UTF8.GetBytes("Some random text which will be encoded as bytes")
        ser.Serialize(ms, obj)
        Console.WriteLine(Encoding.UTF8.GetString(ms.ToArray()))
    End Sub
End Class