Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Παιδες χρειαζομαι αμεσα τη βοηθεια σας.

 

Γραφω ενα προγραμματακι για τη διπλωματικη μου σε Visual Basic, οντας πρωταρης και οχι βαθια μυημενος.

Εχει απλη δομη με ενα μονο Form και το αντιστοιχο Form Class, μεσα στο οποιο δηλωνονται ολες οι μεταβλητες και αναπτυσσεται ο κωδικας.

 

Θελω να δωσω τη δυνατοτητα στο χρηστη να κανει Save/Load με XML De-/Serialization σε ενα σημειο καποιες απαραιτητες μεταβλητες (καμια 30αρια, κυριως string arrays, μερικα απο αυτα multi-dimensional).

 

Ψαχνοντας σε ξενα fora, εχασα τη μπαλα. Το μονο που βρηκα και μπορω να εφαρμοσω ειναι η 2η λυση που προτεινεται εδω http://social.msdn.microsoft.com/Forums/en-US/0357078a-4599-43f4-93a2-bb68b761cccb/save-and-load-an-array

 

Ωστοσο, με αυτον τον τροπο, μπορω να κανω serialize ενα μονο object καθε φορα και σε διαφορετικο .xml file, πραγμα μαλλον επιπονο και καθολου πρακτικο.

Εχετε καμια καλυτερη ιδεα για το τι μπορω να κανω??    :blink:

Δημοσ.

Αν βάλεις όλες τις μεταβλητές που σ' ενδιαφέρουν μέσα σ' ένα object ποιό είναι το πρόβλημα;

 

(δεν πάτησα καν το link)

  • Like 1
Δημοσ.

 

Αν βάλεις όλες τις μεταβλητές που σ' ενδιαφέρουν μέσα σ' ένα object ποιό είναι το πρόβλημα;

 

(δεν πάτησα καν το link)

 

Αυτο ειναι στην ουσια που δεν εχω καταλαβει, τις διαφορες στην ορολογια object/class κλπ.

Δηλαδη εχοντας ηδη δηλωμενες τις μεταβλητες, πως θα τις "βαλω" σε ενα object? Και τι θα ειναι αυτο το object? Μπορεις να μου δωσεις ενα παραδειγμα γιατι τα εχω αρκετα μπερδεμενα αυτη τη στιγμη στο μυαλο μου?

 

Σε ευχαριστω για το χρονο σου παντως

Δημοσ.

Αν δεν έχεις καταλάβει συγκεκριμένα τη διαφορά object/class πραγματικά πρέπει να πας back to basics. Πρακτικά οποιοδήποτε είδους βιβλίο/tutorial κλπ τα καλύπτει αυτά.

 

Τέλος πάντων, ξέροντας τι μεταβλητές θέλεις να κάνεις serialize και τι αντιπροσωπεύει η κάθε μία θα φτιάξεις μια αντίστοιχη class:

Public Class Stuff
    Public Property Name As String
    Public Property MoreNames As New List(Of String)
End Class

Αργότερα όταν έρθει η ώρα να σώσεις θα κάνεις ένα object αυτής της class και θα περάσεις τις τιμές που θέλεις για τα properties που έχει:

Dim stuff = new Stuff() With { Name = "Foo", OtherNames = whatever }

και θα κάνεις serialize αυτό.

  • Like 1
Δημοσ.

Σε ευχαριστω πολυ για τη βοηθεια, εχεις δικιο.

 

Διαβασα αρκετα "θεωρια" κυριως απο msdn και μπορω να πω οτι τα ξεκαθαρισα στο μυαλο μου.

 

Το υλοποιησα οπως ειπες, απλως στο νεο serializable Class, αντι για properties, εθεσα ολα τα variables που χρειαζομαι απο το Form Class, δηλαδη αυτο:

 

Public Class Form1

    

    Public testvar As Integer

    ...

    (Procedures)

    ...

End Class

 

<Serializable()> Public Class Saves

     Public testvar As Integer = Form1.testvar

     ...

End Class

 

Κι επειτα κανω serialize  το Saves. Δουλευει απροβληματιστα, οποτε πιστευω ειναι σωστο.

 

Θα ηθελα να σε ρωτησω κατι τελευταιο. Επειδη εχω αρκετα 2D string arrays, τα οποια δεν ειναι serializable απο οτι διαβασα, υπαρχει κανενας efficient τροπος για να το ξεπερασω αυτο το προβλημα  ( για να αποφυγω τη διαδικασια αν γινεται του σπασιματος σε 1D)?

Δημοσ.

Κι επειτα κανω serialize  το Saves. Δουλευει απροβληματιστα, οποτε πιστευω ειναι σωστο.

Ακαδημαϊκά μιλώντας, στον προγραμματισμό αυτό πολύ εσφαλμένη λογική. Δε θα το αναλύσω, απλά θα σου φέρω ένα παράδειγμα.

 

"Για να πολλαπλασιάσεις δυο αριθμούς, γράψε ένα δίπλα στον άλλο για να προκύψει ένας τρίτος, και από τον τρίτο αυτό αριθμό αφαίρεσε 10 για να βρεις το αποτέλεσμα".

 

1 * 1 => 11 => 1, δουλεύει, άρα σωστό.

 

Συγκεκριμένα τώρα, αυτό που πόσταρες δε γίνεται να δουλεύει (τουλάχιστον αν αυτό είναι όλο) γιατί το "Public testvar As Integer = Form1.testvar" δεν κάνει compile εφόσον το Form1 είναι class και το Form1.testvar δεν είναι shared. Δεν είμαι σίγουρος ποιά ακριβώς είναι η διαφορά ανάμεσα σ' αυτό που έγραψες και σ' αυτό που δουλεύει σε σένα, αλλά υπάρχει κάποια διαφορά.

 

Επίσης γενικά έτσι που το έχεις είναι από αμιγώς προγραμματιστικής οπτικής (πολύ) κακή προσέγγιση αλλά ειλικρινά δε νομίζω ότι πρέπει να σε απασχολεί μιας και ο στόχος εδώ είναι να κάνεις τη δουλειά σου. Just FYI.

 

Για τα arrays που λες, όταν λες 2d εννοείς jagged ή multidimensional? (google για τη διαφορά). Δοκίμασες να το κάνεις; Τι έγινε; Αν δε δούλεψε, ποιός είναι ο κώδικας που δε δουλεύει;

  • Like 1
Δημοσ.

Σε ευχαριστω για τις συμβουλες defacer. Η αληθεια ειναι οτι δεν σπουδαζω προγραμματισμο, αλλα πολιτικος μηχανικος,  και προσπαθω να αναπτυξω μια αντιστοιχη εφαρμογη, χωρις βεβαια να εχω το υποβαθρο ενος φτασμενου developer. Κι επειδη δεν διαθετω αρκετο χρονο, χρησιμοποιω συχνα μπακαλικες μεθοδους :P

 

Επι τουτου τωρα, δουλευει οντως ετσι οπως το εγραψα.

Τι θα ηταν ορθοτερο? Να το διατυπωσω οπως ανεφερες, θετοντας στα properties του Class Saves τις τιμες των μεταβλητων που χρειαζομαι απο το Form Class, και μετα να τις επιστρεψω απο το νεο object της Class Saves παλι πισω στο Form Class? H να κοιταξω να κανω shared τα variables που χρειαζομαι?

 

Τα arrays ειναι multidimensional (,) και δεν γινεται να σειριοποιηθουν. Το διασταυρωσα και σε αλλα φορουμ. Ειναι μαλλον εγγενης περιορισμος της vb.net

 

Δημοσ.

Ναι το πιασα αυτό, αφού σου δουλεύει έτσι άστο έτσι. Απλά μάθε και 2-3 βασικά στην πορεία για να μπορείς αν σταματήσει να δουλεύει λόγω κάποιας αλλαγής να το φτιάξεις.

 

Για το serialization το πιο απλό που μπορείς να κάνεις είναι αντί για multidimensional array να έχεις List(of List (of string)):

    Dim test As List(Of List (Of string)) = New List(Of List (Of string)) From { _
        new List(Of string) From {"a", "b"}, _
        new List(Of string) From {"c", "d"} _
    }
    Dim serializer As New Xml.Serialization.XmlSerializer(test.GetType)    
    serializer.Serialize(Console.Out, test)

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...