|  | @@ -0,0 +1,38 @@
 | 
	
		
			
				|  |  | +Readme for the C#/.NET implementation of Protocol Buffers
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Copyright 2008 Google Inc.
 | 
	
		
			
				|  |  | +http://code.google.com/apis/protocolbuffers/
 | 
	
		
			
				|  |  | +and
 | 
	
		
			
				|  |  | +http://github.com/jskeet/dotnet-protobufs
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +(This will eventually be written up into a full tutorial etc.)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Differences with respect to the Java API
 | 
	
		
			
				|  |  | +----------------------------------------
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Many of the changes are obvious "making it more like .NET", but
 | 
	
		
			
				|  |  | +others are more subtle.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +o Properties and indexers are used reasonably extensively.
 | 
	
		
			
				|  |  | +o newFoo becomes CreateFoo everywhere.
 | 
	
		
			
				|  |  | +o Classes are broken up much more - for instance, there are
 | 
	
		
			
				|  |  | +  namespaces for descriptors and field accessors, just to make it
 | 
	
		
			
				|  |  | +  easier to see what's going on.
 | 
	
		
			
				|  |  | +o There's a mixture of generic and non-generic code. This
 | 
	
		
			
				|  |  | +  is interesting (at least if you're a language nerd). Java's generics
 | 
	
		
			
				|  |  | +  are somewhat different to those of .NET, partly due to type erasure
 | 
	
		
			
				|  |  | +  but in other ways too. .NET allows types to be overloaded by the
 | 
	
		
			
				|  |  | +  number of generic parameters, but there's no such thing as the
 | 
	
		
			
				|  |  | +  "raw" type of a generic type. Combining these two facts, I've
 | 
	
		
			
				|  |  | +  ended up with two interfaces for messages, and two for builders -
 | 
	
		
			
				|  |  | +  in each case, a non-generic one and a generic one which derives
 | 
	
		
			
				|  |  | +  from the generic one. Where the members clash (e.g. IBuilder.Build
 | 
	
		
			
				|  |  | +  and IBuilder<TMessage>.Build vary only by return type) the
 | 
	
		
			
				|  |  | +  implementations use explicit interface implementation to provide
 | 
	
		
			
				|  |  | +  the most useful method in most cases. This is very much like
 | 
	
		
			
				|  |  | +  the normal implementation of IEnumerable<T> which extends
 | 
	
		
			
				|  |  | +  IEnumerable. As an aside, this becomes a pain when trying to
 | 
	
		
			
				|  |  | +  create "the read-only version of this list, whose type I don't
 | 
	
		
			
				|  |  | +  know but I know it's a List<something>". Oh for mumble types.
 | 
	
		
			
				|  |  | +  
 | 
	
		
			
				|  |  | +
 |