안녕하세요 여러분!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
@saj 그의 (C#!) 대답에, 당신은 직렬화 복원 XML이 객체에 기록하기 위해,'PropertyNest' 공공 및 쓰기의 속성을 만들 필요가 말했듯이. – Grim
PropertyNest 클래스의 공개 속성 및 appStreamServerType 열거 형에 대한 코드를 게시하여 컴파일 할 수 있습니다 (로드의 암호화 부분 제거). – Kev