4 // Dick Porter (dick@ximian.com)
6 // (C) 2002 Ximian, Inc. http://www.ximian.com
8 using System.Runtime.Serialization.Formatters;
9 using System.Runtime.Serialization;
10 using System.Reflection;
11 using System.Collections;
13 using System.Runtime.Remoting.Messaging;
15 namespace System.Runtime.Serialization.Formatters.Binary {
16 public sealed class BinaryFormatter : IRemotingFormatter, IFormatter
18 private FormatterAssemblyStyle assembly_format;
19 private SerializationBinder binder;
20 private StreamingContext context;
21 private ISurrogateSelector surrogate_selector;
22 private FormatterTypeStyle type_format;
24 public BinaryFormatter()
26 surrogate_selector=null;
27 context=new StreamingContext(StreamingContextStates.All);
30 public BinaryFormatter(ISurrogateSelector selector, StreamingContext context)
32 surrogate_selector=selector;
36 public FormatterAssemblyStyle AssemblyFormat
39 return(assembly_format);
42 assembly_format=value;
46 public SerializationBinder Binder
56 public StreamingContext Context
66 public ISurrogateSelector SurrogateSelector
69 return(surrogate_selector);
72 surrogate_selector=value;
76 public FormatterTypeStyle TypeFormat
87 public object Deserialize(Stream serializationStream)
89 if(serializationStream==null) {
90 throw new ArgumentNullException("serializationStream is null");
92 if(serializationStream.CanSeek &&
93 serializationStream.Length==0) {
94 throw new SerializationException("serializationStream supports seeking, but its length is 0");
101 public object Deserialize(Stream serializationStream, HeaderHandler handler)
103 if(serializationStream==null) {
104 throw new ArgumentNullException("serializationStream is null");
106 if(serializationStream.CanSeek &&
107 serializationStream.Length==0) {
108 throw new SerializationException("serializationStream supports seeking, but its length is 0");
115 public object DeserializeMethodResponse(Stream serializationStream, HeaderHandler handler, IMethodCallMessage methodCallmessage)
117 if(serializationStream==null) {
118 throw new ArgumentNullException("serializationStream is null");
120 if(serializationStream.CanSeek &&
121 serializationStream.Length==0) {
122 throw new SerializationException("serializationStream supports seeking, but its length is 0");
129 public void Serialize(Stream serializationStream, object graph)
131 if(serializationStream==null) {
132 throw new ArgumentNullException("serializationStream is null");
135 ISerializable ser = graph as ISerializable;
137 StreamingContext context = new StreamingContext (StreamingContextStates.Remoting);
141 SerializationInfo info = new SerializationInfo (graph.GetType (), new FormatterConverter ());
142 ser.GetObjectData (info, context);
143 SerializationInfoEnumerator e = info.GetEnumerator ();
144 oa = new object [info.MemberCount];
146 while (e.MoveNext ()) {
147 oa [i++] = e.Current;
149 Console.WriteLine ("SERIALIZABLE" + info.MemberCount);
151 MemberInfo [] members = FormatterServices.GetSerializableMembers (graph.GetType (), context);
152 oa = FormatterServices.GetObjectData (graph, members);
153 Console.WriteLine ("NOT SERIALIZABLE" + oa.Length);
156 foreach (object o in oa) {
157 Console.WriteLine ("OBJ" + o);
160 throw new NotImplementedException ();
164 public void Serialize(Stream serializationStream, object graph, Header[] headers)
166 if(serializationStream==null) {
167 throw new ArgumentNullException("serializationStream is null");
170 // fixme: what about headers?
171 Serialize (serializationStream, graph);