|
Don't know what happened but is should be:
List Bok BookList = new List Bok (); But whith brackets (which seem to disapear)
And then:
using (Stream s2 = File.Create(path2))
{
xs2.Serialize(s2, BookList);
}
|
|
|
|
|
The BaseClass doesn't know anything about the subclasses, nor does it know what you're doing with them.
The attributes on the members in the base class have nothing to do with OOP. Those attributes are specifically used by the XML Serializer, not any OOP definition.
|
|
|
|
|
Ok. So this is the recommended way of saving objects to disc?
|
|
|
|
|
It all depends on your requirements. There is no "best" way for all situations because "best" is a subjective evaluation.
|
|
|
|
|
Ok. This is my situation right now.
I have a bookclass. In it I declare a customerobjekt pointing to null.
When I make a loan in my librarysystem a customer object is added to it so I know who is lending the book.
In my Customerclass I have a book-list in which I save all the books the customer borrowed.
As long as I doesn´t register a loan all is fine, and I can save both books and customer.
But when I make a loan and have references to objects I ger circular reference.
Is there a way around this?
|
|
|
|
|
There's a special constructor for the Xml serialiser to handle non-homogeneous lists
public XmlSerializer (Type type, Type[] extraTypes)
Basically this tells the serialiser about the main list type and any additional types it may encounter within the list.
Code dump to show what I mean
First generic serialiser/deserialiser methods
public static String SerialiseToString<T>(T data, Type[] additionalTypes) {
XmlSerializer serializer = new XmlSerializer(typeof(T), additionalTypes);
using (StringWriter writer = new StringWriter()) {
serializer.Serialize(writer, data);
return writer.ToString();
}
}
public static T DeserialiseFromString<T>(String xmlstr, Type[] additionalTypes) {
using (StringReader reader = new StringReader(xmlstr)) {
XmlSerializer serializer = new XmlSerializer(typeof(T), additionalTypes);
T temp = (T)serializer.Deserialize(reader);
return temp;
}
}
Serialise a mixed list of Book and EBook as a test
List<Book> lst = new List<Book>();
Book one = new Book();
one.Title = "Swallows and Amazons";
one.Author = "Arthur Ransome";
lst.Add(one);
EBook two = new EBook();
two.Title = "War Horse";
two.Author = "Michael Morpurgo";
two.Platform = "Kindle";
lst.Add(two);
String xmlData = SerialiseToString<List<Book>>(lst, new Type[]{typeof(EBook)});
Gives XML like this (I'm sure you've guessed the structure of the Book and derived EBook classes).
="1.0"="utf-16"
<ArrayOfBook xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Book>
<Title>Swallows and Amazons</Title>
<Author>Arthur Ransome</Author>
</Book>
<Book xsi:type="EBook">
<Title>War Horse</Title>
<Author>Michael Morpurgo</Author>
<Platform>Kindle</Platform>
</Book>
</ArrayOfBook>
which can be deserialised correctly with
List<Book> lst = DeserialiseFromString<List<Book>>(xmlData, new Type[]{typeof(EBook)});
Alan.
|
|
|
|
|
Here is a little background first. I have an ASP.NET app that is used for data entry, etc, and it is used when the users are in the office. Users are authenticated via ActiveDirectory. We're coming up with a lite client app that will be used for when the users are out in the field without a network connection.
Here's where the problems begin. A user can log into their Windows domain account without a network connection; they just won't have access to network resources since they're offline. Therein lies the problem; I can't look them up in AD when they’re offline. My question is can I still authenticate them while being disconnected from the network?
|
|
|
|
|
If you have a web based application, how can they access it without a network connection?
|
|
|
|
|
They cannot, that's where the lite desktop app comes in.
|
|
|
|
|
Without a lite AD, they've got nothing to query, and hence, nothing to authenticate against. Either drop the requirement for disconnected authentication (have 'em authenticate when they're back at work, uploading the new data on the network), or provide a way to authenticate them over the internet.
Keep in mind that I'm sniffing things on my own network, so you might want to encrypt that data if your user is going over somebody else's network
Third option would be a dedicated dial-in. POTS!
Bastard Programmer from Hell
|
|
|
|
|
|
The normal way to do this is to write to a local database, and then use something like Microsoft's Sync Framework[^] to upload the changes when they are connected back into the network.
|
|
|
|
|
I had a feeling someone was going suggest that I left that out of my original question on purpose because I didn't want to have to sync more than what's needed. That's probably what I'll end up doing. Thanks for your input!
|
|
|
|
|
No problem. Without a network connection, whether or not you can verify the user is totally unimportant, you have to store the data somewhere, and that can only be local. I'm not sure what other architecture you thought would be possible, but if you want the changes reflected in the server, then you have to sync the data at some point.
|
|
|
|
|
I want to send a key(TAB) to the window of certmgr.msc.
I have tried using the sendkeys command with no prevail and i have tried sending/posting a message to a handle of the window with no luck.
My suspicion is that there are certain security measures in place to stop programatical input on this window.
Any ideas?
Thanks in advance!
|
|
|
|
|
MitchG92_24 wrote: Any ideas?
Yes, stop using SendKeys, and use programmatic access to the store. What are you trying to achieve? List, import or export certificate?
Bastard Programmer from Hell
|
|
|
|
|
Well we are automating the configuration of a Windows 8 machine, but we need to keep it as close to how it would be acheived through keyboard and mouse.
I need enroll a new certificate and flick some settings here and there within certmgr. Was just seeing if there was a possible way to do it through keypresses, if not then i will look into other methods like the one you have offered
|
|
|
|
|
MitchG92_24 wrote: but we need to keep it as close to how it would be acheived through keyboard
and mouse.
Why? What value does that add? The only thing I can see that's added is the risk of someone messing up the entire script by pressing a key on the keyboard - or worse, moving the mouse by pushing the table.
MitchG92_24 wrote: Was just seeing if there was a possible way to do it through keypresses, if not
then i will look into other methods like the one you have offered
In that case, try AutoHotKey[^] to verify if it can be done by sending keystrokes.
Bastard Programmer from Hell
|
|
|
|
|
Hi,
I have an exception in my application
if I click the button Mysql the combobox loaded with mysql databases names and I select name of the database
if I click the button Sql server the combobox loaded with sql server databases names and I select name of the database
when I click on the button mysql the connection is done and when I change the click on the button sql server, i have an exception
this is the code:
private void btnMySQL_Click(object sender, RoutedEventArgs e)
{
mode = 1;
combdb.ItemsSource = ConnexionMysql.GetDataBasesNames();
}
private void btnSQLserver_Click(object sender, RoutedEventArgs e)
{
mode = 2;
combdb.ItemsSource = ConnexionSqlServer.GetDataBasesNames();
}
private void combdb_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
switch (mode)
{
case 1:
{
datasource = combdb.SelectedItem.ToString();
if (ConnexionMysql.getConnexion(datasource))
{
traitement......
}
else
{
MessageBox.Show("erreur");
}
}
break;
case 2:
{
datasource = combdb.SelectedItem.ToString();
if (ConnexionSqlServer.getConnexion(datasource))
{
.................
}
else
{
MessageBox.Show("erreur");
}
}
break;
}
}
|
|
|
|
|
Did you create a MySql-connection? ConnexionMysql would be empty according to the message.
Bastard Programmer from Hell
|
|
|
|
|
yes i created mysql connexion in a class
//if (ConnexionMysql.getConnexion(datasource))
|
|
|
|
|
Not in the ConnexionMysql class, I hope? The ConnexionMysql object needs to exist (new ConnexionMysql) before you call any non-static methods.
I suggest you create the connection when it's needed, using the standard pattern; create a IDbConnection, create an IDbCommand, open, execute.
Bastard Programmer from Hell
|
|
|
|
|
the connexionmysql is a static class witch contain the connection with database with the method"getconnexion" and function "getdatabasenames"
|
|
|
|
|
Can you post the code of that method? That's where the error will be originating from
Bastard Programmer from Hell
|
|
|
|
|
He should be debugging it, not posting it. It's not a difficult thing for him to do.
|
|
|
|