2014-07-09 5 views
0

안녕하세요 여러분!deserialize 오류를 해결하는 방법은 무엇입니까?

나는 몇 달 동안이 프로그램을 진행 해왔다. 그것의 기본적인 이야기는 iCloud가 애플 리케이션을 위해하는 것처럼 백그라운드에서 윈도우를위한 어플리케이션을 전송하고 설치할 수 있다고 가정합니다!

Anywho, 나는 serialize/deserialize 메서드를 사용하여 속성 (예 : 관리 사용자 이름 및 암호 해시, 디렉토리, 포트 등)을 저장하고 있습니다.

나는 메모리 할당에 대한 속성과 링크를 나타내는 'PropertyNest'클래스를 가지고 있습니다. XMLSerializer가보고 저장하는 부분 만 잘라냅니다.

Public Class PropertyNest 
    'Huge bunch of functions that we dont need to look at 

    '####################### 

    Public _wasLoadedFromFile As Boolean = False 
    Private _port As Integer = 201 
    Private _httpPort As Integer = 202 
    Private _rootFolder As String = "\appstreamRoot" 
    Private _adminUser As String = "Admin" 
    Private _adminPass As String = "21232F297A57A5A743894A0E4A801FC3" 'admin 
    Private _appstreamServerType As appStreamServerType = appStreamServerType.http 
    Private _useDES3forserver As Boolean = True 
    Private _encDES3pswd As String = "21232F297A57A5A743894A0E4A801FC3" 'admin 

    'Properties and descriptors for 'PropertyGrid' object go here \|/ 
    '================================================================= 

End Class 

그리고 그

If settingsfilename = "" Then 
     Property_Nest = New AdvancedSettings.PropertyNest() 
    Else 
     If propFileEncrypted = False Then 
      WriteLog("From unprotected file...", False) 
      Try 
       Property_Nest = AdvancedSettings.PropertyNest.LoadFrom(settingsfilename) 
      Catch ex As Exception 
       WriteLog("FAILED! Making default property nest...") 
       Property_Nest = New AdvancedSettings.PropertyNest() 
      End Try 
     Else 
      WriteLog("From encrypted file...", False) 
      Try 
       Property_Nest = AdvancedSettings.PropertyNest.LoadFrom(settingsfilename, True, propFilePswd) 
      Catch ex As Exception 
       WriteLog("FAILED! Making default property nest...", False) 
       Property_Nest = New AdvancedSettings.PropertyNest() 
      End Try 

     End If 
    End If 

그게 잘 좋은,이 같은 serverMain,

Public Shared Property_Nest As AdvancedSettings.PropertyNest 

, 메인 창에서 선언과 같은 나중에 초기화. 저장된 파일에서 로딩하면 문제가됩니다. PropertyNest 클래스 내부, 정말 같은 프로그램이 시리얼을 가지고 내가 거기에 오류를 표시

Public Sub SaveAs(ByVal filename As String, Optional ByVal Encrypted As Boolean = False) 
     Dim extra As String 
     If Encrypted = True Then : extra = "Encrypted? : Yes." : Else : extra = "Encrypted? : No." 
     End If 
     If filename = Nothing Then 
      Exit Sub 
     End If 
     writeLog2("Saving Property Nest to: " & filename & vbCrLf & extra, False) 

     If Encrypted = False Then 
      Dim writer As New Xml.Serialization.XmlSerializer(GetType(PropertyNest)) 
      Dim file As New System.IO.StreamWriter(filename) 
      writer.Serialize(file, Me) 
      file.Close() 
     Else 
      Dim writer As New Xml.Serialization.XmlSerializer(GetType(PropertyNest)) 
      Dim memstream As New System.IO.MemoryStream 
      writer.Serialize(memstream, Me) 
      memstream.Seek(0, IO.SeekOrigin.Begin) 
      Dim file As New System.IO.StreamWriter(filename) 
      Dim memstreamReader As New System.IO.StreamReader(memstream) 
      Do 
       file.WriteLine(serverMain.admin_des3Manager.Encrypt(memstreamReader.ReadLine())) 
      Loop Until memstreamReader.EndOfStream = True 
      file.Close() 
     End If 
     writeLog2("OK!") 
    End Sub 


    Shared Function LoadFrom(ByVal filename As String, Optional ByVal EncryptedWithPswd As Boolean = False, Optional ByVal Password As String = "") As PropertyNest 
     Dim reader As New Xml.Serialization.XmlSerializer(GetType(PropertyNest)) 
     Dim file As New System.IO.StreamReader(filename) 
     Dim newPropNest As PropertyNest 
     If EncryptedWithPswd = False Then 
      newPropNest = reader.Deserialize(file) 'Error in XML Document(11, 3) 
     Else 
      If Password = "" Then 
       Dim convertedStream As New System.IO.MemoryStream 
       Dim convertedWriter As New System.IO.StreamWriter(convertedStream) 
       Do 
        convertedWriter.WriteLine(serverMain.admin_des3Manager.Decrypt(file.ReadLine())) 
       Loop Until file.EndOfStream = True 
       convertedWriter.Close() 
       newPropNest = reader.Deserialize(convertedStream) 
      Else 
       Dim tempDES3 As New DES3(Password) 
       Dim convertedStream As New System.IO.MemoryStream 
       Dim convertedWriter As New System.IO.StreamWriter(convertedStream) 
       Do 
        convertedWriter.WriteLine(tempDES3.Decrypt(file.ReadLine())) 
       Loop Until file.EndOfStream = True 
       convertedWriter.Close() 
       newPropNest = reader.Deserialize(convertedStream) 
      End If 
     End If 
     Return newPropNest 
    End Function 

(미안의 무리, TrippleDES와 직렬화 된 제품의 선택적 암호화가있다).

피. 거의 끝났어.

내가 지금 암호화에 대한 유일한 걱정, 그래서 사용자 정의, 비 기본 속성 둥지를 저장하기 위해 내 의무를했고, 그렇게 같은 파일에 쓴 :

<?xml version="1.0" encoding="utf-8"?> 
    <PropertyNest xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <_wasLoadedFromFile>false</_wasLoadedFromFile> 
    <ServerPort>2010</ServerPort> 
    <AdminUser>Matthew</AdminUser> 
    <AdminPasswordHash>21232F297A57A5A743894A0E4A801FC3</AdminPasswordHash> 
    <AppStreamPort>2020</AppStreamPort> 
    <AppStream_ServerRoot>\appstreamRoot</AppStream_ServerRoot> 
    <UseDES3>true</UseDES3> 
    <EncDES3Pswd>21232F297A57A5A743894A0E4A801FC3</EncDES3Pswd> 
</PropertyNest> 

신난다! 지금 .... 'LoadFrom'기능을 보면, 내가 어디서 오류를 얻었는지를 알 수 있습니다 ... 11, 3에 오류가 표시되지 않습니다. 제발 도와주세요!

정말 감사합니다 : D

+0

@saj 그의 (C#!) 대답에, 당신은 직렬화 복원 XML이 객체에 기록하기 위해,'PropertyNest' 공공 및 쓰기의 속성을 만들 필요가 말했듯이. – Grim

+0

PropertyNest 클래스의 공개 속성 및 appStreamServerType 열거 형에 대한 코드를 게시하여 컴파일 할 수 있습니다 (로드의 암호화 부분 제거). – Kev

답변

0

귀하의 XML, 당신은 deserialise 필요하지만 클래스, 특수 붙여 편집 메뉴로 이동하여 클립 보드에 XML 복사, 비주얼 스튜디오에 따라 다음과 같이해야 유효 및 과거의 XML을 클래스로 제공하기 때문에 시도해 보시고, 필요하면 VB로 바꿀 수있는 # 변환기를 사용할 수 있습니다.

/// <remarks/> 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] 
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)] 
public partial class PropertyNest 
{ 

    private bool _wasLoadedFromFileField; 

    private ushort serverPortField; 

    private string adminUserField; 

    private string adminPasswordHashField; 

    private ushort appStreamPortField; 

    private string appStream_ServerRootField; 

    private bool useDES3Field; 

    private string encDES3PswdField; 

    /// <remarks/> 
    public bool _wasLoadedFromFile 
    { 
     get 
     { 
      return this._wasLoadedFromFileField; 
     } 
     set 
     { 
      this._wasLoadedFromFileField = value; 
     } 
    } 

    /// <remarks/> 
    public ushort ServerPort 
    { 
     get 
     { 
      return this.serverPortField; 
     } 
     set 
     { 
      this.serverPortField = value; 
     } 
    } 

    /// <remarks/> 
    public string AdminUser 
    { 
     get 
     { 
      return this.adminUserField; 
     } 
     set 
     { 
      this.adminUserField = value; 
     } 
    } 

    /// <remarks/> 
    public string AdminPasswordHash 
    { 
     get 
     { 
      return this.adminPasswordHashField; 
     } 
     set 
     { 
      this.adminPasswordHashField = value; 
     } 
    } 

    /// <remarks/> 
    public ushort AppStreamPort 
    { 
     get 
     { 
      return this.appStreamPortField; 
     } 
     set 
     { 
      this.appStreamPortField = value; 
     } 
    } 

    /// <remarks/> 
    public string AppStream_ServerRoot 
    { 
     get 
     { 
      return this.appStream_ServerRootField; 
     } 
     set 
     { 
      this.appStream_ServerRootField = value; 
     } 
    } 

    /// <remarks/> 
    public bool UseDES3 
    { 
     get 
     { 
      return this.useDES3Field; 
     } 
     set 
     { 
      this.useDES3Field = value; 
     } 
    } 

    /// <remarks/> 
    public string EncDES3Pswd 
    { 
     get 
     { 
      return this.encDES3PswdField; 
     } 
     set 
     { 
      this.encDES3PswdField = value; 
     } 
    } 
} 
+0

속성은 실제로 public입니다. 왜냐하면 그것들은 그 선언에 직접적으로 Get/Sets 만 있기 때문입니다. – matthew

관련 문제