|
I have tested XmlSerializer but even if it works with derived classes I wonder if there isn´t a better way to save objects from derived classes.
What I want to save is a List of derived objects.
|
|
|
|
|
What do you call "better"? You could serialize it in binary, but than you're no longer able to edit your data with a text-editor. OTOH, binary is smaller. Does that count as "better"?
Nah, the "better" way would be to use a database. A relational one. With a normalized dataset. Up to BCNF.
Bastard Programmer from Hell
|
|
|
|
|
Well, now I have to add an XmlInclude attribute to the Book parent class for each such sub-class.
But as I understand it, the base-class shouldn´t have to know about the derived classes in OOP.
As I remember in Java, you didn´t have to do this.
|
|
|
|
|
larsp777 wrote: I have to add
Try without the attribute
Bastard Programmer from Hell
|
|
|
|
|
I have tried that and I get:
The type <type> was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically
It works without derived classes but not when I try with derived classes.
Also in my derived classes I declare another type of object. It´s a library-system. It has a List of book-objects. In the book-class I declare a customer-object in which I save the customer who borrows a book.
|
|
|
|
|
larsp777 wrote: Also in my derived classes I declare another type of object. It´s a
library-system. It has a List of book-objects.
I'd expect a List<books>, not an object. Is that how it's declared?
larsp777 wrote: It works without derived classes but not when I try with derived classes.
Found a similar issue here[^], has two solutions on the bottom of the page.
I can't test them at the moment though, I'm not at home.
Bastard Programmer from Hell
|
|
|
|
|
"I'd expect a List, not an object. Is that how it's declared?"
Not sure what you mean but I declared a List of objects like:
List<book> BookList = new List<book>();
|
|
|
|
|
larsp777 wrote: Not sure what you mean but I declared a List of objects like:
List<book> BookList = new List<book>();
I guess you "need" the attribute because it doesn't know what's going to be stored in the list (being objects).
Can you post me a few lines more? If I put your code in a new project, I get a compile error (as expected, actually);
Error CS0246: The type or namespace name 'List' could not be found (are you missing a using directive or an assembly reference?)
I was expecting a generic list, from the namespace System.Collections.Generic;
System.Collection.Generic.List<Book> bookList =
new System.Collections.Generic.List<Book>();
Sounds like the site that I linked in the previous post is right - which means that their solutions might work
Bastard Programmer from Hell
|
|
|
|
|
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
|
|
|
|