|
[Serializable]
public class DrawableObject {}
[Serializable]
public class Layer : DrawableObject, IList<DrawableObject> {}
[Serializable]
public class Graphic : DrawableObject { }
static void Main(string[] args)
{
Type[] extraType=new Type[]{typeof(DrawableObject),typeof(Layer),typeof(Graphic)};
Layer layer = new Layer();
layer.Add(new Graphic());//add Graphic is ok.
layer.Add(new Layer()); //add Layer occur error
TextWriter textWriter = new StreamWriter("layer.xml");
XmlSerializer xmlSerializer = new XmlSerializer(typeof(Layer), extraType);
xmlSerializer.Serialize(textWriter, layer);
}
There is a exception in Serialize().
InnerException said it cannot include Layer.
Is it possible to make this
<Layer>
<Layer>
<Layer>
<Graphic></Graphic>
</Layer>
<Graphic></Graphic>
</Layer>
<Graphic></Graphic>
</Layer>
|
|
|
|
|
It think, basically, its a case of implementing IXmlSerializable in your classes if you want to finely control how the classes are serialized to Xml. There are also a number of attributes in the System.Xml.Serialization namespace that you can adorn your classes with.
I wrote this small console application sample to demonstrate to you the IXmlSerializable route, which I think will suit you better.
using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.Xml.Schema;
using System.Xml.Serialization;
namespace ConsoleApplication
{
class Program
{
static void Main(string[] args)
{
Layer layer = new Layer();
layer.DrawableObjects.Add(new Graphic());
layer.DrawableObjects.Add(new Layer());
XmlSerializer s = new XmlSerializer(typeof(Layer));
s.Serialize(Console.Out, layer);
Console.ReadLine();
}
}
public abstract class DrawableObject : IXmlSerializable
{
#region IXmlSerializable Members
public virtual XmlSchema GetSchema()
{
throw new NotImplementedException();
}
public abstract void ReadXml(XmlReader reader);
public abstract void WriteXml(XmlWriter writer);
#endregion
}
[Serializable]
[XmlRoot("Root")]
public class Layer : DrawableObject
{
private List<Drawableobject> drawableObjects = new List<Drawableobject>();
public List<Drawableobject> DrawableObjects
{
get
{
return this.drawableObjects;
}
}
public override void WriteXml(XmlWriter writer)
{
writer.WriteStartElement("Layer");
foreach (DrawableObject obj in this.drawableObjects)
obj.WriteXml(writer);
writer.WriteEndElement();
}
public override void ReadXml(XmlReader reader)
{
throw new NotImplementedException();
}
}
[Serializable]
[XmlRoot("Graphic")]
public class Graphic : DrawableObject
{
public override void WriteXml(XmlWriter writer)
{
writer.WriteStartElement("Graphic");
writer.WriteEndElement();
}
public override void ReadXml(XmlReader reader)
{
throw new NotImplementedException();
}
}
}
|
|
|
|
|
Thanks, It is helpful
|
|
|
|
|
Hello everybody.
Let's imagine we have webbrowser control navigated to http://www.codeproject.com, so top banner image advert.gif shows ad1 picture (generated randomly).
How to save this image to the hard drive without requesting it from the server a second time?
If we try to retreive it once again, the advert.gif will show another ad picture, not the one from webbrowser control. I mean the following sample is not ok:
System.Net.WebClient wc = new System.Net.WebClient();
HtmlElementCollection imgs = this.webBrowser1.Document.GetElementsByTagName("img");
for (int i = 0; i < imgs.Count; i++)
{
wc.DownloadFile(imgs[i].GetAttribute("src"), "c:\\images" + i.ToString() + ".jpg");
}
|
|
|
|
|
Sounds like you're doing this backwards.
- Intercept the URL that the user wants to navigate to
- Download and cache all the files for that page
- Set the browser control to point to your own application's cache
- Profit!
"we must lose precision to make significant statements about complex systems."
-deKorvin on uncertainty
|
|
|
|
|
Thanks!
But how to extraxt already loaded image from the webbrower?
|
|
|
|
|
Unfortunately, the only way to get that is to read the browser's cache. If you're using the stock WebBrowser control in System.Windows.Forms , then you're going to have to read the Internet Explorer cache, assuming that the user has their Internet Options set to cache pages.
To read IE's cache, you're going to have to interface with the Win32 API. Specifically, read this article[^] found right here on The Code Project.
"we must lose precision to make significant statements about complex systems."
-deKorvin on uncertainty
|
|
|
|
|
hi all,
am developing an excel com addin using c#. In my addin, I am supposed to
generate few buttons on the excel sheet's cells and perform their respective events on clicking.
Every thing is working fine. Every button is named 'search' and is associated
with its appropriate event handler(searchButton_Click). The button and its
event handler constitute an object(of 'result' class). Now I tried to
serialize the class Result so that I can save all the currently exisitng
'Result' objects, on the active sheet, to a file such that if I save this excel sheet and re open
the sheet, I should be able to get back the controls(de serialize) of all the
buttons present on the saved sheet. How ever in the serialization step, I am
getting an exception that says:
[System.Runtime.Serialization.SerializationException] = {"Type 'System.__ComObject' in Assembly 'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' is not marked as serializable."}
Could anyone here please help me identify the exact problem here and am I
missing anything? I did mark the class 'result' as 'Serializable'. In my
'result' class I have the code to generate a button on the sheet's active
cell and that button's event handler.
The buttons am generating on the excel sheet's cells are 'MSForms.CommandButton' types.
Many thanks in advance!
|
|
|
|
|
Did ya Google it? I just did and found a crap ton of results!
The best way to accelerate a Macintosh is at 9.8m/sec² - Marcus Dolengo
|
|
|
|
|
Hey, i did google but still not able to understand why am I not able to do it.
Also, I have a doubt, if am doing some thing like this(code below) in a normal project(not an excel addin),this is working fine:
emp[] e = {
new emp(1,"Mark",5000),
new emp(2,"Mich",6000),
new emp ( 3, "Amol", 4460 ),
new emp ( 4, "Anil", 9456 ),
new emp ( 5, "Srikanth", 9500 ),
};
//SERIALIZING PART
Stream s = File.Open("c:\\New Folder\\emp.txt", FileMode.Create,FileAccess.ReadWrite);
BinaryFormatter b = new BinaryFormatter();
b.Serialize(s, e);
s.Close();
//DESERIALIZING PART
s = File.Open("c:\\New Folder\\emp.txt", FileMode.Open, FileAccess.ReadWrite);
emp[] ee = (emp[])b.Deserialize(s);
foreach (emp ez in ee)
MessageBox.Show(ez.ToString());
s.Close();
But, the same is not working when am introducing this piece of code in my excel-addin project. What could be the reason for this behavour?!
Thanks.
|
|
|
|
|
Hello
I am doing C#.NET application.I want to run a background process until my application exit.How can I implement the above using thread.
|
|
|
|
|
Like this:
using System;
using System.Threading;
namespace BackgroundThread
{
class Program
{
static void Main(string[] args)
{
Thread t = new Thread(BackgroundMethod);
t.IsBackground = true;
t.Start();
Console.ReadLine();
}
private static void BackgroundMethod()
{
while (true)
{
Thread.Sleep(1000);
Console.WriteLine("Tick");
}
}
}
}
Regards,
Rob Philpott.
|
|
|
|
|
Try using BackgroundWorker component which u can find in ToolBox of Visual Studio.
Krishnraj
|
|
|
|
|
BackGroundWorkers are for forms though, maybe his program doesn't have a form.
Though, if you use a form, the BackGroundWorker is the easiest way to go.
Just remember to lock any objects while they're being worked on, but beware of dealocks (more than one thread locking the same object).
|
|
|
|
|
Dear All
I want a simple threading example in VS 2005 C#. When i run the project it should display a label with yellow background and increases it width 1px witn 1000ms interval.
I have googled it out but they are using delegates & some are using timer but i dont want to use both.
Any kind of help will be appreciated.
Thanks.
|
|
|
|
|
I don't think that you can do this without the help of delegates. You wont be able to modify a control created in one thread from another.
Check the following links:
Invoke Required[^]
http://msdn.microsoft.com/en-us/library/ms171728(VS.80).aspx[^]
WinSolution wrote: I want a simple threading example in VS 2005 C#
You have to that do it yourself. If you are finding any issues post it here and we can help with it.
|
|
|
|
|
Yes i have tried and i found Cross Thread Error thats why i tried here if there is any way.
Basically i have shifted from Java to CSharp as i am working with C# last 8 months but i haven't learnt some new concept of c#. I was good in Java's Threading as wished if there is another way.
Thanks.
|
|
|
|
|
this can be done without using a delegate if you are doing the label updating through the thread where the label is created(means in the main form thread). if you use another thread to increase the value and the label is in the main thread you have to use the delegate. because cross thread operations are not allowed .
|
|
|
|
|
Following is the code which i tried but got error of Cross Thread.
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
ThreadStart ts = new ThreadStart(ProgressBar);
Thread th = new Thread(ts);
th.Start();
}
public void ProgressBar()
{
label1.Width += 1;
Thread.Sleep(1000);
}
}
Please share if you can figure out the problem
|
|
|
|
|
Reiterating what everyone has already mentioned. You cannot change UI state from a *non-UI* thread. ProgressBar is running on a non-UI thread. Use, BeginInvoke. Read the links already shared to you or see here[^]
|
|
|
|
|
Use Control.Invoke method to update controls on main thread.........
|
|
|
|
|
Hi,
if all you want the thread to do is move a Label, then you don't need a thread at all. Just use a Windows.Forms.Timer, that is a timer that ticks on the GUI thread, hence you can have the Tick handler manipulate Controls without any InvokeRequired/Invoke (as long as it is fast, otherwise your GUI would freeze).
Luc Pattyn [Forum Guidelines] [My Articles]
- before you ask a question here, search CodeProject, then Google
- the quality and detail of your question reflects on the effectiveness of the help you are likely to get
- use the code block button (PRE tags) to preserve formatting when showing multi-line code snippets
modified on Sunday, June 12, 2011 8:37 AM
|
|
|
|
|
Hi Guys need help!
Currently i created a class file and generate to a dll file for my ASP.net web page use.
However when i recompile after editing my class file. I copy my new dll over to my web project
i can't seem to run my asp.net web page.
Do i need to recompile my ASp.net page as well after i copy my new dll file over.
KaKaShi HaTaKe
|
|
|
|
|
Did you tried Ctrl+F5. I think its due to cache. with Ctrl+F5 it will reload the dll from the host.
Please recheck if your compilation was 100% successful and confirm if you have 0 errors
|
|
|
|
|
Hmph ok....
What happen if is another C#.EXE programme that using the dll file.
The DLL edit and compile is 100% success
But in Another programme i copy the new dll over can't seem to work as well
KaKaShi HaTaKe
|
|
|
|